使用cuda和CUB的简化示例

使用cuda和CUB的简化示例,cuda,cub,Cuda,Cub,我正试着去了解一下CUB,但在遵循(相当不完整的)工作示例时遇到了一些麻烦。CUB看起来是一个很棒的工具,我就是搞不懂示例代码 我构建了一个简单的proto warp reduce示例: #include <cub/cub.cuh> #include <cuda.h> #include <vector> using std::vector; #include <iostream> using std::cout; using std::endl;

我正试着去了解一下CUB,但在遵循(相当不完整的)工作示例时遇到了一些麻烦。CUB看起来是一个很棒的工具,我就是搞不懂示例代码

我构建了一个简单的proto warp reduce示例:

#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;
}
#包括
#包括
#包括
使用std::vector;
#包括
使用std::cout;
使用std::endl;
常数int N=128;
__全局无效和(浮点*indata,浮点*outdata){
typedef cub::WarpReduce WarpReduce;
__共享类型名称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(){
向量y(N),sol(N);
浮动*dev_y,*dev_sol;
cudamaloc((无效**)和dev_y,N*sizeof(浮动));
Cudamaloc((无效**)和dev_sol,N*sizeof(浮动));
对于(int i=0;icout您的
cudaMemcpy
参数从后到前,首先是目标(与
memcpy
一致)


有关更多信息,请参见。

您的
cudaMemcpy
参数前后颠倒,首先是目标(与
memcpy
一致)


有关更多信息,请参阅。

CUB现在有自己的标记和标记wiki条目……这始终是一个好主意,尤其是当您在CUDA代码方面遇到问题时。它会在您的
cudaMemcpy
调用中抛出错误。请不要编辑问题来修复代码/解决问题。这样做会使.question无效。CUB现在有自己的标记标记wiki条目……总是一个好主意,尤其是当您在使用CUDA代码时。它会在您的
cudaMemcpy
调用中抛出错误。请不要编辑问题来修复代码/解决问题。这样做会使.question无效。
cudaError_t cudaMemcpy ( void* dst, const void* src, size_t count, cudaMemcpyKind kind )