1
我试图让我的头部绕过CUB,并且在(不完整的)工作示例之后有点麻烦。 CUB看起来像是一个很棒的工具,我无法理解示例代码。使用cuda和CUB的缩减例子
我已经建立了一个简单的原经减少例如:
#include <cub/cub.cuh>
#include <cuda.h>
#include <vector>
using std::vector;
#include <iostream>
using std::cout;
using std::endl;
const int N = 128;
__global__ void sum(float *indata, float *outdata) {
typedef cub::WarpReduce<float,4> WarpReduce;
__shared__ typename WarpReduce::TempStorage temp_storage;
int id = blockIdx.x*blockDim.x+threadIdx.x;
if(id < 128) {
outdata[id] = WarpReduce(temp_storage).Sum(indata[id]);
}
}
int main() {
vector<float> y(N), sol(N);
float *dev_y, *dev_sol;
cudaMalloc((void**)&dev_y,N*sizeof(float));
cudaMalloc((void**)&dev_sol,N*sizeof(float));
for(int i = 0; i < N; i++) {
y[i] = (float)i;
}
cout << "input: ";
for(int i = 0; i < N; i++) cout << y[i] << " ";
cout << endl;
cudaMemcpy(&y[0],dev_y,N*sizeof(float),cudaMemcpyHostToDevice);
sum<<<1,32>>>(dev_y,dev_sol);
cudaMemcpy(dev_sol,&sol[0],N*sizeof(float),cudaMemcpyDeviceToHost);
cout << "output: ";
for(int i = 0; i < N; i++) cout << sol[i] << " ";
cout << endl;
cudaFree(dev_y);
cudaFree(dev_sol);
return 0;
}
返回全部为零。
我知道这段代码会返回一个约束的约简,每个第32个元素是一个warp和其他元素的未定义总和 - 我只想了解CUB的工作方式。有人能指出我做错了什么吗?
(也确实值得CUB自己的标签吗?)
CUB现在有自己的标签和标签维基条目... – talonmies
[cuda错误检查](http://stackoverflow.com/questions/14038589/what-is-the-canonical-way-to-check-for -errors-using-the-cuda-runtime-api)总是一个好主意,尤其是当您在使用CUDA代码时遇到问题时。它会在你的'cudaMemcpy'调用中抛出错误。 –
请不要编辑问题以修复代码/解决问题。你这样做是无效的。 – talonmies