Цикл внутри кода CUDA - PullRequest
       4

Цикл внутри кода CUDA

0 голосов
/ 01 марта 2012

Я запустил некоторый код CUDA, который обновил массив с плавающей точкой. У меня есть функция-оболочка, подобная описанной в Как я могу скомпилировать код CUDA и затем связать его с проектом C ++? этот вопрос.

Внутри моей функции CUDA я создаю цикл for следующим образом ...

int tid = threadIdx.x;
for(int i=0;i<X;i++)
{
     //code here
}

Теперь проблема в том, что если X равен значению 100, все работает просто отлично, но если X равен 1000000, мой вектор не обновляется (почти как если бы код внутри цикла for не получался выполняется)

Теперь внутри функции-обертки, если я вызываю функцию CUDA в цикле for, она все равно работает просто отлично (но по какой-то причине значительно медленнее, чем если бы я просто выполняла один и тот же процесс на процессоре), как это. ..

for(int i=0;i<1000000;i++)
{
      update<<<NumObjects,1>>>(dev_a, NumObjects);
}

Кто-нибудь знает, почему я могу выполнить миллион раз в функции-обертке, а не просто вызвать функцию обновления CUDA один раз, а затем внутри этой функции запустить цикл for из миллиона?

1 Ответ

0 голосов
/ 26 марта 2012

Вы должны использовать cudaThreadSynchronize и cudaGetLastError после запуска этого, чтобы увидеть, есть ли какая-либо ошибка. Я представляю, в первый раз, это истекло. Это происходит, если ядру требуется много времени для завершения. Карта просто сдаётся.

Во-вторых, причина того, что выполнение занимает гораздо больше времени, заключается в том, что для каждого запуска ядра установлено время загрузки. Когда у вас был цикл внутри ядра, вы однажды испытали эту нагрузку и запустили цикл. Теперь вы испытываете это X раз. Накладные расходы довольно малы, но достаточно велики, чтобы как можно больше цикла помещалось в ядро.

Если X особенно велик, вы можете попытаться выполнить как можно больше циклов в ядре, пока он не завершится за безопасное время, а затем выполнить цикл по этим ядрам.

...