CUDA: сильно ли замедляет запуск ядра передача аргументов ядру?

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

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

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

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

Таким образом, для запуска ядра некоторый сигнал, очевидно, должен пройти от ЦП к графическому процессору, но мне интересно, заметно ли замедляет этот процесс передача аргументов.

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

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

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

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

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

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


person Eskil    schedule 28.06.2011    source источник


Ответы (2)


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

Сказав это, если вы хотите попробовать, логический способ повлиять на это - использовать постоянную память. Определите каждый аргумент как символ __constant__ в области единицы перевода, затем используйте cudaMemcpyToSymbol для копирования значений с хоста в постоянную память устройства.

person talonmies    schedule 28.06.2011

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

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

person CygnusX1    schedule 28.06.2011
comment
В крайнем случае, при использовании очень плотных ядер, это может иметь значение, но, конечно, это верно только в том случае, если в это время не выполняется другая операция с более высокой задержкой. - person pszilard; 29.06.2011
comment
Даже с очень тугими ядрами. Отправка 1 байта или 10 КБ на GPU не имеет значения. Это займет столько же времени из-за задержки, а не пропускной способности. Когда вы начинаете отправлять мегабайты данных, пропускная способность может сыграть роль... - person CygnusX1; 29.06.2011