【问题标题】:reduction example using cuda and CUB使用 cuda 和 CUB 的减少示例
【发布时间】:2013-08-29 04:30:25
【问题描述】:

我正在尝试了解 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;
}

返回全零。

我知道这段代码将返回一个缩减,该缩减是与每个第 32 个元素结合在一起的,即一个扭曲的总和,而其他元素未定义 - 我只是想了解一下 CUB 的工作原理。有人能指出我做错了什么吗?

(另外,CUB 还应该有自己的标签吗?)

【问题讨论】:

  • CUB 现在有自己的标签和标签 wiki 条目...
  • cuda error checking 总是一个好主意,尤其是当您遇到 CUDA 代码问题时。它会在您的cudaMemcpy 调用中引发错误。
  • 请不要编辑问题来修复代码/解决问题。您这样做是在使 the.question 无效。

标签: cuda cub


【解决方案1】:

您的cudaMemcpy 参数从后到前,目的地在前(与memcpy 保持一致)。

cudaError_t cudaMemcpy ( void* dst, const void* src, size_t count, cudaMemcpyKind kind )

请参阅API reference 了解更多信息。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-04-15
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多