От чего зависит длина вызова синхронизации CUDA? - PullRequest
0 голосов
/ 04 мая 2018

У меня возникли проблемы с пониманием вызова синхронизации CUDA. Исходя из моего личного понимания вывода nvprof, среда выполнения наших программ для GPU состоит из двух частей: время работы ядра GPU и время выполнения API CUDA , и у нас есть

Total Runtime = GPU Kernel Runtime + CUDA API Runtime

Однако представьте, что у нас большое ядро ​​A и маленькое ядро ​​B. Очевидно, что время ядра GPU A будет больше B. Но как насчет времени для звонков cudaDeviceSynchronize? Всегда ли гарантируется, что A будет тратить больше времени на синхронизацию по сравнению с B? Какие факторы определяют продолжительность звонков cudaDeviceSynchronize?


Извините, но просто хочу уточнить мой вопрос: предположим, что у нас есть следующая программа:

float * a, b, c;  time_T tic, toc, t_A, t_B;

tic = time();
kernel_A <<< ... >>> (a, b, c);
cudaDeviceSynchronize();
toc = time(); t_A = toc - tic;

tic = time()
kernel_B <<< ... >>> (a, b, c);
cudaDeviceSynchronize();
toc = time(); t_B = toc - tic;

Предположим, что kernel_B выполняет поэлементное вычисление c = a + b, а kernel_A делает то же самое, за исключением 10 итераций.

Очевидно, с нашей точки зрения, kernel_A должно занять большее время для выполнения по сравнению с kernel_B (т.е. t_A > t_B). Проблема в том, почему выполнение kernel_A?

занимает больше времени

В соответствии с формулой времени выполнения, заданной nvprof, которая гласит, что Total Runtime = GPU Kernel Runtime + CUDA API Runtime, есть три возможных объяснения:

  • kernel_A имеет больше GPU Kernel Runtime.
  • kernel_A имеет больше CUDA API Runtime (т.е. cudaDeviceSynchronize).
  • kernel_A длиннее в обоих компонентах.

1 Ответ

0 голосов
/ 04 мая 2018

Cuda не ожидает выполнения ядер, когда они выполняются. Когда вы вызываете ядро, вы просто запрашиваете графический процессор о запуске ядра. Когда вы используете cudaSyncronize, вы просто ждете, когда GPU или CPU завершат свое выполнение, чтобы они могли встретиться на линии, где вы вызвали cudaSyncronize.


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

...