2012-06-25 110 views
3

p爲第一組位置的矩陣,其中每行給出特定點的座標。類似地,讓q是第二組位置的矩陣,其中每行給出特定點的座標。在GPU上計算平方歐幾里得距離矩陣

然後公式成對平方歐氏距離爲:

k(i,j) = (p(i,:) - q(j,:))*(p(i,:) - q(j,:))', 

其中p(i,:)表示矩陣pi行,第p'表示的p轉置。

我想在C++中使用支持CUDA的GPU(NVidia Tesla)計算矩陣k。我擁有支持GPU的OpenCV v.2.4.1,但我可以使用其他替代方法,如Thrust庫。不過,我對GPU編程不太熟悉。你能建議一種有效的方法來完成這項任務嗎?我應該使用哪些C++庫?

+1

順便說一下,你正在計算歐幾里得距離的平方... – Pedro

+0

@Pedro:我想這就是爲什麼它被描述爲「成對*平方*歐幾里德距離」(強調我的)..... 。 – talonmies

+0

@talonmies:是的,通過編輯時間戳的外觀,它只是與我的評論重疊。 – Pedro

回答

3

該問題看起來很簡單,足以使圖書館過度殺傷。

不知道的ij的範圍內,我建議你的分區k成每32個線程,並在每個塊多塊,計算

float sum, myp[d]; 
int i = blockIdx.x*blockDim.x + threadIdx.x; 
for (int kk = 0 ; kk < d ; kk++) 
    myp[kk] = p(i,kk); 
for (j = blockIdx.y*blockDim.y ; j < (blockIdx.y+1)*blockDim ; j++) { 
    #pragma unroll 
    for (sum = 0.0f , int kk = 0 ; kk < d ; kk++) { 
     temp = myp[kk] - q(j,kk); 
     sum += temp*temp; 
     } 
    k(i,j) = sum; 
    } 

在那裏我假設你的數據有d尺寸和寫作p(i,k),q(j,k)k(to mean an access to a two-dimensional array. I also took the liberty in assuming that your data is of type浮動`。

請注意,根據k的存儲方式,例如,行主要或列主要,您可能想循環每個線程i而不是合併寫入到k

+0

感謝cuda c代碼!我有一個OpenCV庫(我使用它)支持GPU矩陣操作,所以可以先嚐試一下。 – Alexey

相關問題