我是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
}
}
}
Run Code Online (Sandbox Code Playgroud)
是pow
不是在内核代码中定义的?
你的问题是,虽然pow
在CUDA数学API中定义(见这里),但它不是专门用于整数参数的模板,即.没有这样的版本:
__device__ ? int pow ( int x, int y )
Run Code Online (Sandbox Code Playgroud)
这就是您收到错误的原因.您需要将base参数显式地转换为浮点类型,如下所示:
dist_dev[idx] = pow((double)(x_d[idx] - x_d[i]), 2.0) +
pow((double)(y_d[idx] - y_d[i]), 2.0);
Run Code Online (Sandbox Code Playgroud)
话虽如此,从效率的角度来看,在整个方形的示例中使用双精度浮点指数将是很差的.最好使用整数乘法来执行计算:
int dx = x_d[idx] - x_d[i];
int dy = y_d[idx] - y_d[i];
dist_dev[idx] = (dx * dx) + (dy * dy);
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
4446 次 |
最近记录: |