【问题标题】:CUDA pow function with integer arguments具有整数参数的 CUDA pow 函数
【发布时间】:2013-05-05 06:53:13
【问题描述】:

我是 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 没有在内核代码中定义吗?

【问题讨论】:

    标签: cuda gpgpu


    【解决方案1】:

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

    __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:这与我回答中的最后一个代码 sn-p 相同。你是想表达某种观点吗?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-01-19
    • 1970-01-01
    • 1970-01-01
    • 2021-07-08
    • 2014-12-31
    • 2018-05-31
    相关资源
    最近更新 更多