Как распараллелить три вложенных цикла for для сложения трех векторов в CUDA? - PullRequest
0 голосов
/ 12 февраля 2019

Например,

for(i = 0 to 1000){
 for(j= 0 to 1000){
  for(k = 0 to 1000){
   add(a[i],b[j],c[k]);
  }
 }
}

Это структура серийного кода.В CUDA я могу написать

__global__ void add (int *a, int *b, int *c, int *d)
{
  int tidx = blockIdx.x*blockDim.x+threadIdx.x;

  if(tidx<1000){
     for(j= 0 to 1000){
       for(k = 0 to 1000){
        d[tidx] = a[idx]+b[j]+c[k];
       }
     }

     add<<<1,1000>>>(a,b,c,d);//1D thread
  }
}

Как я могу использовать трехмерное распределение потоков для вышеуказанного кода?

Спасибо

1 Ответ

0 голосов
/ 12 февраля 2019

Во-первых, прочитайте хорошую статью о сокращении, такую ​​как эта .

Чтобы получить больше измерений, как здесь, просто сведите их в один одномерный массив.

index1D = indexX + SizeY * indexY + SizeY * SizeZ * indexZ;

Конечно, вы должны заменить indexX, -Y, -Z представлениями вашей сетки.

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