CUDA - что делает этот цикл - PullRequest
5 голосов
/ 16 марта 2011

Эй Я видел на сайте этот пример ядра

 __global__ void loop1( int N, float alpha, float* x, float* y ) {
   int i;
   int i0 = blockIdx.x*blockDim.x + threadIdx.x;

   for(i=i0;i<N;i+=blockDim.x*gridDim.x) {
      y[i] = alpha*x[i] + y[i];
    }
}   

Для вычисления этой функции в C

   for(i=0;i<N;i++) {
      y[i] = alpha*x[i] + y[i];
   }

Конечно, цикл for внутри ядра не нужен? и вы можете просто сделать y[i0] = alpha*x[i0] + y[i0] и полностью удалить цикл for.

Мне просто любопытно, почему он там и какова его цель. Предполагается, что вызов ядра, такой как loop1<<<64,256>>>>, предположительно gridDim.x = 1

Ответы [ 3 ]

4 голосов
/ 16 марта 2011

Вам нужен цикл for в ядре, если в вашем векторе больше записей, чем у вас запущенных потоков.Если это возможно, то, конечно, более эффективно запускать достаточное количество потоков.

2 голосов
/ 17 марта 2011

Интересное ядро.Цикл внутри ядра необходим, потому что N больше, чем общее количество потоков, которое составляет 16 384 (blockDim.x * gridDim.x), , но я думаю, что это не очень хорошая практика, (Весь смысл CUDA заключается в использовании концепции SIMT).Согласно Руководству по программированию CUDA вы можете иметь максимум 65535 блоков потоков с одним ядром.Кроме того, начиная с Compute Capability 2.x (Fermi), вы можете иметь не более 1024 потоков на один блок (512 до Fermi). Также вы можете (если возможно) разделить код на несколько (последовательных) ядер.

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

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

Кстати, комментатор упомянул, что в этом коде будут проблемы слияния, и я не понимаю, почему. Если базовые адреса правильно выровнены (64B, поскольку они являются числами с плавающей запятой), все транзакции памяти с помощью этого кода будут объединены при условии, что потоки / блок также делятся на 64.

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