Является ли cudamalloc медленнее, чем cudamemcpy? - PullRequest
3 голосов
/ 14 июля 2011

Я работаю над кодом, который должен быть эффективным по времени и, следовательно, использующим Cufft для этой цели, но когда я пытаюсь вычислить fft очень больших данных параллельно, это медленнее, чем cpu fftw, и причина, которую я нахожу после нахождениявремя для каждой строки кода, использующего высокоточный временной код, заключается в том, что cudamalloc занимает около 0,983 секунды, в то время как время для остальных строк кода составляет около 0,00xx секунды, что ожидается ...

я прошелнекоторые из связанных постов, но в соответствии с ними

основная задержка с графическими процессорами связана с передачей памяти, а не с выделением памяти

А также в одном из постов было написаночто

Самый первый вызов любой из функций библиотеки cuda запускает подпрограмму инициализации

что является действительной причиной этой задержки ... или это не нормальноиметь такую ​​задержку в выполнении кода ???

Заранее спасибо

Ответы [ 2 ]

4 голосов
/ 14 июля 2011

Возможно ли, что наблюдаемая вами большая задержка (около 1 с) вызвана инициализацией драйвера?Это кажется довольно длинным для cudaMalloc.Также убедитесь, что ваш драйвер обновлен.

Задержка первого запуска ядра может быть вызвана рядом факторов:

  1. Инициализация драйвера
  2. PTX-компиляция
  3. Создание контекста

Первый из них применим только в том случае, если вы работаете в системе Linux без X. В этом случае драйвер загружается только тогда, когда требуется, а затем выгружается,Запуск nvidia-smi -pm 1 от имени пользователя root запустит драйвер в постоянном режиме, чтобы избежать таких задержек, за подробностями обращайтесь к man nvidia-smi и не забудьте добавить его в сценарий инициализации, поскольку он не будет сохраняться при перезагрузке.

Вторая задержка заключается в компиляции PTX для конкретной архитектуры устройства в вашей системе.Этого легко избежать, внедрив двоичный файл для архитектуры вашего устройства (или архитектур, если вы хотите поддерживать несколько арок без компиляции PTX) в исполняемый файл.См. Руководство по программированию CUDA C (доступно на веб-сайте NVIDIA ) для получения дополнительной информации, в разделе 3.1.1.2 рассказывается о компиляции JIT.

Третий момент, создание контекста, неизбежен, но NVIDIA ушлаприложить большие усилия для снижения стоимости.Создание контекста включает копирование исполняемого кода на устройство, копирование любых объектов данных, настройку системы памяти и т. Д.

2 голосов
/ 14 июля 2011

Это понятно.Nvcc встраивает код ptx в двоичный файл приложения, который должен быть скомпилирован в двоичный файл gpu с использованием JIT-компилятора.Это объясняет задержку запуска.AFAIK malloc не медленнее memcpy.

Также верно, что cudaRegisterFatBinary и cudaRegisterFunction вставляются nvcc в ваш код, чтобы зарегистрировать ваше ядро ​​и его точку входа во время выполнения.Я думаю, это инициализация, о которой вы говорите.

...