CUDA整数幂函数的使用

5
我是新手在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个回答

11

你的问题在于,虽然 pow 在 CUDA 数学 API 中有定义(参见这里),但它没有为整数参数进行模板专门化,即没有像这样的版本:

__device__ ​ int pow ( int  x, int  y ) 
这就是为什么会出现错误的原因。您需要将基础参数明确转换为浮点类型,例如:
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); 

dist_dev[idx] = ((x_d[idx] - x_d[i]) * (x_d[idx] - x_d[i])) + ((y_d[idx] - y_d[i]) * (y_d[idx] - y_d[i])); - Alamin
1
@Alamin:这与我回答中的最后一段代码片段完全相同。你是想表达什么意思吗? - talonmies

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接