我一直试图通过减少来计算出一个算法来获得CUDA程序中两个向量的点积,并且似乎被卡住了:/
本质上,我正在尝试用CUDA编写这段代码:
for (int i = 0; i < n; i++)
h_h += h_a[i] * h_b[i];
其中h_a
和h_b
是浮点数组,h_h
总结点积。
我正在尝试使用减少 - 到目前为止我已经有了这个...
__global__ void dot_product(int n, float * d_a, float * d_b){
int i = threadIdx.x;
for (int stride = 1; i + stride < n; stride <<= 1) {
if (i % (2 * stride) == 0){
d_a[i] += d_a[i + stride] * d_b[i + stride];
}
__syncthreads();
}
}
如果我将主线更改为d_a[i] += d_a[i + stride];
,它会很好地总结阵列。从我收集的内容来看,我似乎遇到了一个并行的问题。有人可以指出我的问题吗?
我的内核调用是:
dot_product<<<1, n>>>(n, d_a, d_b);
,其中n
是每个数组的大小。
答案 0 :(得分:2)
这里有两个问题:
你想做这样的事情:
__global__ void dot_product(int n, float * d_a, float * d_b){
int i = threadIdx.x;
d_a[i] = d_a[i] * d_b[i]; // d_a now contains products
__syncthreads();
for (int stride = 1; i + stride < n; stride <<= 1) {
if (i % (2 * stride) == 0){
d_a[i] += d_a[i + stride]; // which are summed by reduction
}
__syncthreads();
}
}
[免责声明:用浏览器编写,绝不编译或测试,自担风险使用]