Pycuda: выделение памяти в GPU для списка

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

Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
0
0
1 261
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

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 Спасибо, я преобразовал его в пустой массив, и теперь он работает нормально.

oshadhi 23.08.2019 10:55

Другие вопросы по теме