CUDA: Передача аргументов ядру сильно замедляет запуск ядра? - PullRequest
5 голосов
/ 28 июня 2011

CUDA новичок здесь.

В моем коде я в настоящее время запускаю ядра много раз в цикле в коде хоста.(Потому что мне нужна синхронизация между блоками).Поэтому я подумал, смогу ли я оптимизировать запуск ядра.

Запуски моего ядра выглядят примерно так:

MyKernel<<<blocks,threadsperblock>>>(double_ptr, double_ptr, int N, double x);

Так что для запуска ядра какой-то сигнал, очевидно, должен идти отCPU для GPU, но мне интересно, если передача аргументов делает этот процесс заметно медленнее.

Аргументы ядра одинаковы каждый раз, так что, возможно, я мог бы сэкономить время, скопировав их один раз,получить доступ к ним в ядре по имени, определенному

__device__ int N;
<and somehow (how?) copy the value to this name N on the GPU once>

, и просто запустить ядро ​​без аргументов как таковых

MyKernel<<<blocks,threadsperblock>>>();

Это ускорит мою программу?Каков наилучший способ сделать это?AFAIK аргументы хранятся в некоторой постоянной глобальной памяти.Как я могу убедиться, что переданные вручную значения хранятся в памяти, которая быстрая или быстрая?

Заранее благодарен за любую помощь.

Ответы [ 2 ]

5 голосов
/ 28 июня 2011

Я ожидаю, что преимущества такой оптимизации будут довольно малы.На вменяемых платформах (т. Е. Чем-либо, кроме WDDM) накладные расходы на запуск ядра составляют порядка 10-20 микросекунд, поэтому, вероятно, не так много возможностей для улучшения.Вы хотите попробовать, логический способ повлиять на это, используя постоянную память.Определите каждый аргумент как символ __constant__ в области действия единицы перевода, затем используйте функцию cudaMemcpyToSymbol для копирования значений с хоста в постоянную память устройства.

3 голосов
/ 28 июня 2011

Простой ответ: нет.

Чтобы быть более сложным: вам все равно нужно отправить некоторые сигналы с хоста на графический процессор, чтобы запустить само ядро. На этом этапе несколько больше байтов данных параметров больше не имеют значения.

...