Реализуйте эту проблему в 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;