Позвольте мне сначала ответить на ваш последний вопрос:
Будет ли копирование всего 1 целого числа после каждого запуска ядра замедлять мою программу?
Немного - да.Выполнение команды, ожидание ответа графического процессора и т. Д., И т. Д. Количество данных (1 int против 100 ints), вероятно, не имеет большого значения в этом случае.Тем не менее, вы все равно можете достичь скорости тысяч передач памяти в секунду.Скорее всего, ваше ядро будет работать медленнее, чем эта единичная передача памяти (в противном случае, вероятно, лучше будет выполнить всю задачу на процессоре)
Каков наилучший способ сделать это?
Ну, я бы предложил просто попробовать это самостоятельно.Как вы сказали: вы можете использовать закрепленную на карте память и сделать так, чтобы ваше ядро сохраняло значение непосредственно в ОЗУ, или использовать cudaMemcpy.Первый из них может быть лучше, если ваши ядра все еще имеют некоторую работу после отправки целого числа обратно.В этом случае задержка отправки его на хост может быть скрыта при выполнении ядра.
Если вы используете первый метод, вам придется вызвать cudaThreadsynchronize()
, чтобы убедиться, что ядро завершило свое выполнение.,Вызовы ядра являются асинхронными.
Вы можете использовать cudaMemcpyAsync
, который также является асинхронным, но в GPU не может быть запущено ядро, а cudaMemcpyAsync
выполняется параллельно, если вы не используете потоки.
Я никогдана самом деле пытался это сделать, но если ваша программа не потерпит крах, если цикл будет выполняться слишком много раз, вы могли бы попытаться проигнорировать синхронизацию и позволить ей повторяться до тех пор, пока в RAM не появится специальное значение.В этом решении передача памяти может быть полностью скрыта, и вы будете платить накладные расходы только в конце.Однако вам нужно будет как-то предотвратить повторение цикла слишком много раз, события CUDA могут быть полезны.