Сложный цикл для переноса в ядро ​​CUDA - PullRequest
0 голосов
/ 03 июля 2011

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

int current=0;
int ptr=0;

for (int i=0; i < Nbeans; i++){
  for(int j=0;j< NbeamletsPerbeam[i];j++){

     current = j + ptr;

     for(int k=0;k<Nmax;k++){
        ......
     }

     ptr+=NbeamletsPerbeam[i];
 }   
}

Я был бы очень рад, если бы у кого-нибудь было представление о том, как это сделатьили как это можно сделать.Мы говорим о Nbeams = 5, NbeamletsPerBeam около 200 каждый.

Это то, что у меня сейчас есть, но я не уверен, что это правильно ...

 for (int i= blockIdx.x; i < d_params->Nbeams; i += gridDim.x){
            for (int j= threadIdx.y; j < d_beamletsPerBeam[i]; j+= blockDim.y){
                 currentBeamlet= j+k;
                 for (int ivoxel= threadIdx.x; ivoxel < totalVoxels; ivoxel += blockDim.x){

1 Ответ

1 голос
/ 15 июля 2011

Я бы предложил эту идею.Но вам может потребоваться внести незначительные изменения в зависимости от вашего кода.

dim3 blocks(NoOfThreads, 1);
dim3 grid(Nbeans, 1);

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

__global__ kernel()
{
   int noOfBlocks = ( NbeamletsPerbeam[blockIdx.x] + blockDim.x -1)/blockDim.x;

   for(int j=0; j< noOfBlocks;j++){
     //  use threads and compute.... 
     if( (threadIdx.x * j) < NbeamletsPerbeam[blockIdx.x]) {
       current = (threadIdx.x * j) + ptr;

       for(int k=0;k<Nmax;k++){
          ......
       }

       ptr+=NbeamletsPerbeam[blockIdx.x];
    }
 }   
} 

Это должно сработать и даст вам лучшее распараллеливание.

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