2013-05-05 43 views
1

我是CUDA中的新成員,無法理解我在做什麼錯誤。使用整數參數的CUDA pow函數

我試圖計算出物體的距離它在陣列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

回答

6

您的問題是,雖然pow在CUDA math 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); 
+0

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 2013-05-11 00:05:43

+1

@Alamin:這與我答案中的最後一段代碼片段相同。你是否試圖提出某種觀點? – talonmies 2013-05-11 05:56:34