Я хочу запустить простую программу Pycuda, чтобы обновить список на GPU. Ниже приведен мой список.
dm_count = [[0], [1, 2], [3, 4, 5], [6, 7, 8, 9]].
У меня есть этот список в качестве входных данных и ожидается обновление списка входных данных параллельно.
Выдает исключение, когда я пытаюсь выделить память в графическом процессоре, используя mem_alloc ().
Это дает ошибку атрибута, говорящую, что у объекта "list" нет атрибута "nbytes". Когда я ищу ответы, некоторые говорят, что нужно преобразовать список в виде массива, иначе n-байты не могут быть применены. Кажется, он поддерживает только массивы в форматах [[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)
Ожидаемый результат: результат = [[0], [0, 2], [0, 0, 5], [0, 0, 0, 9]]
Сообщение об ошибке: Traceback (последний вызов был последним): File
"test_pycuda.py", строка 55, в
dm_gpu = cuda.mem_alloc (dm_count.nbytes)
AttributeError: у объекта 'list' нет атрибута 'nbytes'