Преобразование C / C ++ для циклов в CUDA - PullRequest
2 голосов
/ 07 июля 2011

Я хотел бы понять, как преобразовать основные циклы C / C ++ в ядро ​​CUDA. Скажем так:

for (int i=0;i < MAXi;i++)
   for(int j=0;j< MAXj;j++){

       ...code that uses i and j....
   }

Все, что мне нужно для вычисления элементов MAXj. Это может быть очень простым для некоторых людей, но я действительно борюсь здесь. Допустим, что Maxj составляет около миллиона, MAXj = 1000000; и там мы хотим, чтобы все темы работали. Я был успешным только с внутренним циклом:

int tid=threadIdx.x + blockDim.x*blockIdx.x + blockDim.x*gridDim.x*blockIdx.y;

используя 2d блоки, как я могу распараллелить циклы такого типа? Они очень распространены в Си, и было бы очень полезно узнать, как это сделать.

1 Ответ

3 голосов
/ 15 июля 2011

Один из лучших способов разделения этих видов 2D-циклов - использование 1D-блоков и сеток

dim3 blocks(MAXj, 1);
dim3 grids(MAXi, 1);

kernel<<<grids, blocks, 1>>>()

__global__ kernel()
{
   int i = blockIdx.x;
   int j = threadIdx.x;

   ...code that uses i and j....

}

Внутренний цикл разделен на потоки, а внешний цикл разделен на блоки (2D блоки)

если MAXj и MAXi - очень большие значения, вам нужно разделить их на небольшие группы и вычислить. Код очень похож на тот, что размещен в этой теме .

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