Ядро CUDA-вложенный цикл for
Привет Я пытаюсь написать ядро 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;
    }
}
это то, что у меня есть в настоящее время, но это, похоже, не дает правильных результатов? кто-нибудь знает что я делаю неправильно. Ура!--3-->
__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 ответов
реализовать эту проблему в 2D и запустить ядро с 2D блоков потоков. Общее количество потоков в измерениях x и y будет равно в общей сумме . Код ядра должен выглядеть следующим образом:
__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;
Я, вероятно, ошибаюсь, но n < (total-1) Регистрация
for (int n = idx; n < (total-1); n += blockDim.x*gridDim.x)
Кажется, отличается от оригинальной версии.
почему бы вам просто не удалить цикл outter и запустить ядро с таким количеством потоков, сколько вам нужно для этого цикла? Немного странно иметь цикл, который зависит от вашего blockId. Обычно вы пытаетесь избежать этих петель.
Во-вторых мне кажется, что newvalues[i] может быть overriden различными потоками.