在CUDA中计算2个矩阵之间的欧几里德距离
Computing Euclidean distances between 2 matrices in CUDA
我正在用CUDA编写程序,问题如下:
-
两个矩阵A (n * 128)和B (m * 128)
-
我取A的第一行,然后计算这个向量和B的所有行之间的距离,一个接一个
-
我将每个距离的结果写在矩阵C的一行上,因此C的元素C(I,j)包含a的第I行和b的第j行之间的距离
-然后继续下一行a
我是这样实现的:我有一个由(n * m)块组成的网格,每个块有128个线程。(1 * 128).
程序正在编译,但问题是它不能给出良好的距离。我不知道哪里不对……
PS:我有CUDA 6.0与NVIDIA GTX 650(计算能力3.0)
__global__ void EuclidianDistances( float *A, float *B , float *C , int n , int m)
{
// SIZE is equal to 128
__shared__ float accumResult[SIZE];
__shared__ float sA[SIZE];
__shared__ float sB[SIZE];
// MAPPING
int bx = blockIdx.x; // n
int by = blockIdx.y; // m
int ty = threadIdx.y; // 128
int tx = threadIdx.x; // 1
sA[ty] = A [bx * SIZE + ty];
sB[ty] = B [by * SIZE + ty];
__syncthreads();
accumResult[ty] = (sA[ty] - sB[ty])*(sA[ty] - sB[ty]);
__syncthreads();
// Parallel tree-reduction
for (int stride = SIZE/2 ; stride < 0 ; stride >>= 1)
if (ty < stride)
{
accumResult[ty] += accumResult [stride + ty];
__syncthreads();
}
// Writing results to output matrix
if ((threadIdx.y == 0))
C [bx * m + by] = accumResult[ty];
__syncthreads();
}
情况看起来不对:
for (int stride = SIZE/2 ; stride < 0 ; stride >>= 1)
假设SIZE为128,这将不会被执行。而且if语句中的__synchthread
可能会使整个程序停止
编辑:看了OP的评论后,我意识到这是一个语言问题…下面是一个代码片段:
#include <iostream>
using namespace std;
int main() {
int SIZE = 128;
for (int stride = SIZE/2 ; stride < 0 ; stride >>= 1)
cout << "Hello I'm running" << endl;
return 0;
}
http://ideone.com/AyhXYF 输出为:nothing。看一下c++中的for循环语法,第二部分是应该在循环的整个持续时间内持续的条件。如果以false条件开始,循环将永远不会执行。
相关文章:
- 使用内在指令的欧几里得距离
- 如何在不导致堆栈溢出的情况下计算非常大的数字和很小的 HCF.我正在使用欧几里得算法
- 咖啡馆欧几里得损失计算超过图像
- 本玄C++;欧几里得变换与特征::变换
- 如何在OpENCV中的图像中找到像素之间的欧几里得距离
- 使用欧几里得公式求全毕达哥拉斯三元组
- 将欧几里得转换为C 和OpenCV中的均匀空间
- 欧几里得的扩展算法C++
- C++中的欧几里得整数模
- 实现欧几里得除法,根据两个正整数的线性组合编写这两个正整数的最大公约数
- 使用欧几里得算法找到GCF(GCD)
- 在 GPU 上计算欧几里得距离矩阵的平方
- 在 c++ 中扩展欧几里得算法的递归中究竟发生了什么?
- 使用 int 数组作为键的二叉树(欧几里得距离)
- 欧几里得算法函数参数
- 寻找毕达哥拉斯三元组:欧几里得公式
- 如何在GUI更新之间暂停几秒钟
- 使用欧几里得算法识别两个值的最大公约数 (GCD)
- 在CUDA中计算2个矩阵之间的欧几里德距离
- 咖啡中的欧几里得损失层