4

p是第一组位置的矩阵,其中每一行给出特定点的坐标。类似地,让q是第二组位置的矩阵,其中每一行给出特定点的坐标。

那么成对平方欧几里得距离的公式是:

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

其中p(i,:)表示i矩阵 的第 - 行pp'表示 的转置p

我想k用 C++ 在支持 CUDA 的 GPU (NVidia Tesla) 上计算矩阵。我有支持 GPU 的 OpenCV v.2.4.1,但我对其他替代方案持开放态度,例如 Thrust 库。但是,我对 GPU 编程不太熟悉。你能建议一种有效的方法来完成这项任务吗?我应该使用哪些 C++ 库?

4

1 回答 1

4

这个问题看起来很简单,足以使图书馆矫枉过正。

i在不知道and的范围的情况下j,我建议您将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++ ) {
    sum = 0.0f;
    #pragma unroll
    for ( 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(i,j)意味着对二维数组的访问。我还冒昧地假设您的数据类型为float.

请注意,根据k存储方式,例如行优先或列优先,您可能希望循环i每个线程而不是合并写入k.

于 2012-06-25T20:35:13.540 回答