计算GPU上的平方欧几里德距离矩阵

时间:2012-06-25 20:22:16

标签: c++ cuda gpu euclidean-distance

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

然后,成对平方欧几里德距离的公式为:

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

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

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

1 个答案:

答案 0 :(得分: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++ ) {
    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的存储方式,例如row-major或column-major,您可能希望在每个线程上循环i,而不是将合并写入k