Проводится ли какая-либо оптимизация, если снова и снова запускать одно и то же ядро ​​с одним и тем же вводом? - PullRequest
0 голосов
/ 11 мая 2011

Если я запускаю одно и то же ядро ​​ с одним и тем же вводом несколько раз, как это

#define N 2000
for(int i = 0; i < 2000; i++) {
    mykernel<<<1,120>>>(...);
}

, что происходит?Я рассчитал время и поиграл с N: вдвое N (до 1000), вдвое сократил время, которое потребовалось.

И все же я немного осторожен, чтобы поверить, что он просто запускает ядро ​​2000 раз, потому чтоускорение по сравнению с кодом без CUDA настолько впечатляет (от ~ 900 с до ~ 0,9 с).Так какую же оптимизацию выполняет CUDA в этом случае?Кэширование результатов?

Установка CUDA_LAUNCH_BLOCKING=1 не изменила ничего.

mykernel заменяет внутренний цикл в коде, не являющемся CUDA.

Аппаратное обеспечение - GeForce GTX260

Ответы [ 2 ]

1 голос
/ 11 мая 2011

CUDA не занимается какой-либо оптимизацией или кэшированием результатов.Если вы запускаете 2000 ядер, он запускает 2000 ядер.

Однако запуск ядра происходит асинхронно, поэтому измерение времени, необходимого для запуска 2000 экземпляров ядра в цикле, не совпадает с общим временем выполнения этих 2000экземпляры ядра.Вероятно, то, что вы видите, является артефактом неправильного измерения времени, а не истинного ускорения.

0 голосов
/ 11 мая 2011

Это правдоподобно. У меня было ядро, которое было в 1600 раз лучше оптимизированного кода процессора. Я не думаю, что есть фактическое кэширование результатов.

Обратите внимание, что при первом запуске CUDA время может немного отличаться. Таким образом, выполнение 1 запуска ядра не может быть точно 1/1000 времени для 1000 запусков ядра. Для больших чисел он линейный, как вы заметили.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...