2013-08-29 58 views
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自己的標籤嗎?)

+0

CUB現在有自己的標籤和標籤維基條目... – talonmies

+1

[cuda錯誤檢查](http://stackoverflow.com/questions/14038589/what-is-the-canonical-way-to-check-for -errors-using-the-cuda-runtime-api)總是一個好主意,尤其是當您在使用CUDA代碼時遇到問題時。它會在你的'cudaMemcpy'調用中拋出錯誤。 –

+1

請不要編輯問題以修復代碼/解決問題。你這樣做是無效的。 – talonmies

回答

1

cudaMemcpy論點後到前,目標是第一位的(要與memcpy一致)。

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

查看API reference瞭解更多信息。