Я хочу запустить простую программу pycuda, чтобы обновить список на GPU. Ниже мой список. dm_count = [[0], [1, 2], [3, 4, 5], [6, 7, 8, 9]]. У меня есть этот список в качестве входных данных, и я ожидал, что список входных данных будет обновляться параллельно. Выдает исключение, когда я пытаюсь выделить память в графическом процессоре с помощью mem_alloc().
Это дает ошибку атрибута, говорящую, что «объект 'list' не имеет атрибута 'nbytes'». Когда я ищу ответы, некоторые говорят, что нужно преобразовать список в виде массива, а в противном случае nbytes не могут быть применены. Кажется, поддерживаются массивы только в формате [[1,1],[1,1],[2,4]]. Но я не хочу менять список. Как выделить память в gpu, сохранив список в исходном формате?
Я не знаю, правильно ли работает memcpy_dtoh(). Как я могу исправить эту программу, чтобы получить ожидаемый результат?
import pycuda.driver as cuda
import pycuda.autoinit
from pycuda.compiler import SourceModule
import numpy
dm_count = [[0], [1, 2], [3, 4, 5], [6, 7, 8, 9]]
length = len(dm_count)
mod = SourceModule("""
__global__ void UpdateMatrix(int **dm_count, int length)
{
int row = threadIdx.x + blockIdx.x*blockDim.x;
int col = threadIdx.y + blockIdx.y*blockDim.y;
if ( (row < length) && (col< row)){
dm_count[row][col] = 0 ;
}
}
""")
dm_gpu = cuda.mem_alloc(dm_count.nbytes)
cuda.memcpy_htod(dm_gpu, dm_count)
func = mod.get_function("updateMatrix")
func(dm_gpu, block=(length, length, 1))
result = numpy.empty_like(dm_count)
cuda.memcpy_dtoh(result, dm_gpu)
print(result)
Expected Result: result = [[0], [0, 2], [0, 0, 5], [0, 0, 0, 9]]
Error Message: Traceback (most recent call last): File "test_pycuda.py", line 55, in dm_gpu = cuda.mem_alloc(dm_count.nbytes) AttributeError: 'list' object has no attribute 'nbytes'
I want to run a simple pycuda program to update a list on the gpu
Невозможно манипулировать списком Python в PyCUDA. В общем, PyCUDA может работать только с массивами numpy с ограниченным набором dtypes и аналогичными типами, которые поддерживают Буферный протокол Python.
В результате вы могли бы потенциально переписать свой код, чтобы использовать массив numpy подходящего dtype в качестве входных данных для ядра, хотя вам пришлось бы разработать представление зубчатого массива, которое было бы совместимо с непрерывным массивом numpy. Затем вам нужно будет написать ядро CUDA для использования разработанного вами формата (обратите внимание, что ваше текущее ядро сломано несколькими способами, что означает, что оно не будет работать, даже если список был принят PyCUDA как ввод).
@talonomies Спасибо, я преобразовал его в пустой массив, и теперь он работает нормально.