Параметры для ядер CUDA - PullRequest
8 голосов
/ 29 ноября 2011

При вызове ядра CUDA для конкретной конфигурации потока существуют ли строгие правила в каком пространстве памяти (устройстве / хосте) должны храниться параметры ядра и какого типа они должны быть?

Предположим, я запускаю 1-D сетку потоков с

kernel<<<numblocks, threadsperblock >>> (/*parameters*/)

Могу ли я передать целочисленный параметр int foo, который является host -integer переменной, напрямую к ядру CUDA? Или я должен cudaMalloc памяти для одного целого числа сказать dev_foo, затем cudaMemcpy foo в devfoo и затем передать devfoo в качестве параметра ядра?

Ответы [ 2 ]

12 голосов
/ 29 ноября 2011

Правила для аргументов ядра являются логическим следствием правил передачи параметров C ++ и того факта, что память устройства и хоста физически разделены.

CUDA не позволяет передавать аргументы по ссылке, и вы должны быть осторожны с указателями.

В частности, вы должны передавать параметры по значению.Передача пользовательских типов требует, чтобы конструктор копирования по умолчанию или ваш собственный конструктор копирования (если он есть) не содержал выделения памяти (выделения кучи с помощью «new» или «malloc»).

В общем, передача по значению хорошо работает для целочисленных, плавающих или других примитивных типов и простых плоских определяемых пользователем структур или объектов классов.

5 голосов
/ 29 ноября 2011

Вам нужно использовать только cudaMalloc() и cudaMemcpy() для блоков данных. Не один int с и тому подобное. Вы также можете передать struct s в качестве параметров, если у них нет членов, указывающих на блок данных в памяти хоста.

Так что, как правило: если вы передаете указатель ядру, убедитесь, что он указывает на память устройства.

...