CUDA内核 - 嵌套for循环

时间:2011-03-15 00:11:59

标签: cuda

您好 我正在尝试编写一个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 个答案:

答案 0 :(得分:10)

在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;

答案 1 :(得分:0)

我可能会出错,但 n < (total-1) 签入

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

似乎与原始版本不同。

答案 2 :(得分:0)

为什么不直接删除outter循环并使用此循环所需的线程启动内核?有一个取决于你的blockId的循环有点奇怪。通常你试图避免这些循环。 其次,在我看来newvalues[i]可以被不同的线程覆盖。