2013-05-31 8 views
2

Ребята, пожалуйста, подтвердите, правильно ли я думаю.CUDA эффективный вызов ядра

Предположим, у меня есть функция ядра mykernel(double *array). Я хочу, чтобы код внутри ядра выполнялся 128 раз. Я могу сделать это двумя способами при вызове ядра от хоста:

mykernel<<<128, 1>>>(myarray); 
//or 
mykernel<<<1, 128>>>(myarray); 

С первого вызова я буду создавать 128 блоков, каждый из которых выполняет 1 поток. Во втором вызове я создам 1 блок с 128 потоками. Но поскольку код внутри ядра работает над одним и тем же массивом, более эффективно использовать второй вызов.

Неужели я дурак или должен придерживаться обучения CUDA? :)

ответ

5

Это зависит. Первый вызов будет создавать несколько блоков, но каждый блок будет слишком мал, чтобы эффективно использовать многопроцессоры вашего GPU (они даже меньше размера warp). Второй вызов не будет использовать множественные многопроцессоры на вашем графическом процессоре. Если вам действительно нужно только 128 потоков, то я предлагаю вам попробовать что-то вдоль линий

mykernel<<<4, 32>>>(myarray); 

Но обычно вам нужно бенчмарка код с различными параметрами для оптимизации производительности в любом случае, YMMV.

+2

Спасибо за объяснение. Я забыл задать еще один вопрос в своем ответе: мне нужно скопировать простые переменные (например, int) на устройство так же, как массивы? –

+0

Нет, вам не обязательно. На самом деле может быть предпочтительнее передавать их непосредственно в качестве параметров ядра. – gentryx

0

Что значит выполнение 128 раз? Если вам нужно перебирать массив по 128 раз, и каждая итерация зависит от предыдущих результатов, тогда вам нужно разбить массив на разумные куски и запустить код, а затем синхронизировать и повторять.

В общем случае, если у вас есть только 128 элементов, то их все в одном блоке должно быть в порядке, потому что доступ к памяти может быть быстрее.

0

Наилучшее использование потоков CUDA в блоках 32. Это называется перекосами.

1 warp = 32 threads.

Итак, смоделируйте свой код, учитывая это.

+1

Согласно http://on-demand.gputechconf.com/gtc-express/2011/presentations/cuda_webinars_WarpsAndOccupancy.pdf (слайд # 9), следует избегать небольших размеров блоков, и они предполагают, что 128 ~ 256 потоков. Наверное, в конце концов, нужно экспериментировать с этими размерами, чтобы оптимизировать производительность своих кодов. –

Смежные вопросы