带有整数参数的CUDA pow函数

时间:2013-05-05 06:53:13

标签: cuda gpgpu

我是CUDA的新手,无法理解我做错了什么。

我正在尝试计算它在数组中具有id的对象的距离,数组中的轴x和数组中的y轴以查找每个对象的邻居

__global__ 
void dist(int *id_d, int *x_d, int *y_d, 
              int *dist_dev, int dimBlock, int i)
{
    int idx = threadIdx.x + blockIdx.x*blockDim.x;

    while(idx < dimBlock){
        int i;
        for(i= 0; i< dimBlock; i++){
            if (idx == i)continue;
            dist_dev[idx] = pow(x_d[idx] - x_d[i], 2) + pow(y_d[idx] - y_d[i], 2); // error here
        }
    }
}

内核代码中是否未定义pow

1 个答案:

答案 0 :(得分:7)

您的问题是,虽然在CUDA数学API中定义了pow(请参阅here),但它不是专用于整数参数的模板,即。没有这样的版本:

__device__ ​ int pow ( int  x, int  y ) 

这就是您收到错误的原因。您需要将base参数显式地转换为浮点类型,如下所示:

dist_dev[idx] = pow((double)(x_d[idx] - x_d[i]), 2.0) + 
                    pow((double)(y_d[idx] - y_d[i]), 2.0); 

话虽如此,从效率的角度来看,在整个方形的示例中使用双精度浮点指数将是很差的。最好使用整数乘法来执行计算:

int dx = x_d[idx] - x_d[i];
int dy = y_d[idx] - y_d[i];
dist_dev[idx] = (dx * dx) + (dy * dy);