在 GPU 上计算欧几里得距离矩阵的平方
Calculate squared Euclidean distance matrix on GPU
设p
第一组位置的矩阵,其中每行给出特定点的坐标。类似地,让我们q
第二组位置的矩阵,其中每行给出特定点的坐标。
那么成对平方欧几里得距离的公式为:
k(i,j) = (p(i,:) - q(j,:))*(p(i,:) - q(j,:))',
其中p(i,:)
表示矩阵p
的第i
行,p'
表示p
的转置。
我想在C++中在支持 CUDA 的 GPU(NVidia Tesla)上计算矩阵k
。我有支持 GPU 的 OpenCV v.2.4.1,但我对其他替代方案持开放态度,例如 Thrust 库。但是,我对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;
}
我假设您的数据具有d
维度,并写入p(i,k)
、q(j,k)
和k(i,j)
表示对二维数组的访问。我也冒昧地假设您的数据属于 float
型。
请注意,根据k
的存储方式,例如行主或列主,您可能希望遍历每个线程i
,而不是将合并的写入k
。
相关文章:
- 使用内在指令的欧几里得距离
- 如何在不导致堆栈溢出的情况下计算非常大的数字和很小的 HCF.我正在使用欧几里得算法
- 咖啡馆欧几里得损失计算超过图像
- 本玄C++;欧几里得变换与特征::变换
- 如何在OpENCV中的图像中找到像素之间的欧几里得距离
- 使用欧几里得公式求全毕达哥拉斯三元组
- 将欧几里得转换为C 和OpenCV中的均匀空间
- 欧几里得的扩展算法C++
- 几个单词Qt c++的QStrings之间的距离
- C++中的欧几里得整数模
- 实现欧几里得除法,根据两个正整数的线性组合编写这两个正整数的最大公约数
- 使用欧几里得算法找到GCF(GCD)
- 在 GPU 上计算欧几里得距离矩阵的平方
- 在 c++ 中扩展欧几里得算法的递归中究竟发生了什么?
- 使用 int 数组作为键的二叉树(欧几里得距离)
- 欧几里得算法函数参数
- 寻找毕达哥拉斯三元组:欧几里得公式
- 使用欧几里得算法识别两个值的最大公约数 (GCD)
- 在CUDA中计算2个矩阵之间的欧几里德距离
- 咖啡中的欧几里得损失层