pycuda: выделение памяти в gpu для списка - PullRequest
0 голосов
/ 05 июля 2019

Я хочу запустить простую программу 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'

...