Ядро CUDA - вложено в цикл - PullRequest
7 голосов
/ 15 марта 2011

Здравствуйте, я пытаюсь написать ядро ​​CUDA для выполнения следующего фрагмента кода.

for (n = 0; n < (total-1); n++)
{
  a = values[n];

  for ( i = n+1; i < total ; i++)
  {
    b = values[i] - a;
    c = b*b;

    if( c < 10)
        newvalues[i] = c;
    }
}

Это то, что я имею в настоящее время, но, похоже, оно не дает правильных результатов?Кто-нибудь знает, что я делаю не так.Ура

__global__ void calc(int total, float *values, float *newvalues){

float a,b,c;

int idx = blockIdx.x * blockDim.x + threadIdx.x;

for (int n = idx; n < (total-1); n += blockDim.x*gridDim.x){
    a = values[n];

    for(int i = n+1; i < total; i++){
        b = values[i] - a;
        c = b*b;

    if( c < 10)
        newvalues[i] = c;

    }
}

Ответы [ 3 ]

10 голосов
/ 15 марта 2011

Реализуйте эту проблему в 2D и запустите ваше ядро ​​с блоками 2D потоков. Общее количество потоков в измерениях x и y будет равно total . Код ядра должен выглядеть следующим образом:

__global__ void calc(float *values, float *newvalues, int total){


float a,b,c;

int n= blockIdy.y * blockDim.y + threadIdx.y;
int i= blockIdx.x * blockDim.x + threadIdx.x;

  if (n>=total || i>=total)
        return;

a = values[n];
b = values[i] - a;
c = b*b;
 if( c < 10)
        newvalues[i] = c;  

// I don't know your problem statement but i think it should be like: newvalues[n*total+i] = c;  


}

Обновление:

Вот как вы должны называть ядро ​​

dim3 block(16,16);
dim3 grid (  (total+15)/16,  (total+15)/16  );
calc<<<grid,block>>>(float *val, float *newval, int T);

Также убедитесь, что вы добавили эту строку в ядро ​​(см. Обновленное ядро)

if (n>=total || i>=total)
return;
0 голосов
/ 15 марта 2011

Почему бы вам просто не удалить внешний цикл и запустить ядро ​​с таким количеством потоков, сколько вам нужно для этого цикла? Немного странно иметь цикл, который зависит от вашего blockId. Обычно вы пытаетесь избежать этих петель. Во-вторых, мне кажется, что newvalues[i] может быть переопределено разными потоками.

0 голосов
/ 15 марта 2011

Я, наверное, ошибаюсь, но n < (total-1) отметится

for (int n = idx; n < (total-1); n += blockDim.x*gridDim.x)

, кажется, отличается от оригинальной версии.

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