C++ 在GPU上计算平方欧氏距离矩阵

C++ 在GPU上计算平方欧氏距离矩阵,c++,cuda,gpu,euclidean-distance,C++,Cuda,Gpu,Euclidean Distance,设p为第一组位置的矩阵,其中每行给出特定点的坐标。类似地,设q是第二组位置的矩阵,其中每行给出特定点的坐标 那么两两平方欧氏距离的公式是: k(i,j) = (p(i,:) - q(j,:))*(p(i,:) - q(j,:))', 其中p(i,:)表示矩阵的第th行p,而p'表示p的转置 我想在C++中使用CUDA使能GPU(Nvidia Tesla)计算矩阵代码>代码>。我有OpenCV v.2.4.1和GPU支持,但我对其他选择持开放态度,比如推力库。然而,我不太熟悉GPU编程。你能提

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

那么两两平方欧氏距离的公式是:

k(i,j) = (p(i,:) - q(j,:))*(p(i,:) - q(j,:))', 
其中
p(i,:)
表示矩阵的第th行
p
,而
p'
表示
p
的转置


我想在C++中使用CUDA使能GPU(Nvidia Tesla)计算矩阵<代码>代码>代码>。我有OpenCV v.2.4.1和GPU支持,但我对其他选择持开放态度,比如推力库。然而,我不太熟悉GPU编程。你能提出一个有效的方法来完成这项任务吗?我应该使用什么C++库? 这个问题看起来很简单,足以让一个库大做文章

在不知道
i
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;
    }
float sum,myp[d];
int i=blockIdx.x*blockDim.x+threadIdx.x;
对于(int kk=0;kk
其中,我假设您的数据具有
d
维度,并写入
p(I,k)
q(j,k)
k(I,j)
,表示访问二维数组。我还冒昧地假设您的数据类型为
float


请注意,根据
k
的存储方式,例如行主线程或列主线程,您可能希望在每个线程上循环
i
,以获得对
k

的合并写入,感谢cuda c代码!我有一个支持GPU矩阵运算的OpenCV库(无论如何我都会用到),所以我可以先试试。顺便说一下,你正在计算欧几里德距离的平方…@Pedro:我想这就是为什么它被描述为“成对平方欧几里德距离”(emphasis mine)…@Talonmes:是的,从编辑的时间戳来看,它只是与我的评论重叠。是的。。我昨天更新了我的问题