定义自定义扫描操作符

时间:2016-03-03 03:45:29

标签: c++ cuda

我正在尝试在幼崽中创建自己的扫描操作符。它现在正在工作,但仅适用于小于1024的数组,这使我认为它只适用于块。这是我的代码:

#include "cub/cub.cuh" 
using namespace cub;


typedef int mytype;

struct CustomMin
{
    template <typename T>
    __host__ __device__
    CUB_RUNTIME_FUNCTION __forceinline__
    mytype operator()(const T &a, const T &b) const {
        return (b < a) ? b : a;
    }
};


int main(int argc, char *argv[])
{

    int num_items = 512;       
    mytype *h_in;   
    mytype *h_out;         
    CustomMin    min_op;
    const size_t size = num_items * sizeof(mytype);
    h_in = (mytype*)malloc(size); 
    h_out = (mytype*)malloc(size); 
    mytype *d_in = NULL;
    cudaMalloc(&d_in, size);
    mytype *d_out = NULL;
    cudaMalloc(&d_out, size);
    for (int i = 0; i < num_items; i++) {
        h_in[i] = i;
    }
    cudaMemcpy(d_in, h_in, size, cudaMemcpyHostToDevice);
    void *d_temp_storage = NULL;
    size_t temp_storage_bytes = 0;
    DeviceScan::InclusiveScan(d_temp_storage, temp_storage_bytes, d_in, d_out, min_op, num_items);
    cudaMalloc(&d_temp_storage, temp_storage_bytes);
    DeviceScan::InclusiveScan(d_temp_storage, temp_storage_bytes, d_in, d_out, min_op, num_items);
    cudaMemcpy(h_out, d_out, size, cudaMemcpyDeviceToHost);
    printf("done!\n");
    return 0;
}

对于较大的输入尺寸,它总是挂起。

1 个答案:

答案 0 :(得分:2)

使用CUB 1.4.1,我可以在编译时重现挂起:

nvcc -arch=sm_35 -o t25 t25.cu

将发布的代码中的num_items更改为2048。

根据我的测试,问题似乎已在cub 1.5.1中修复。请更新到最新的CUB版本。