cuda :: cub错误从__device__函数调用__host__函数是不允许的

时间:2018-06-05 01:28:30

标签: cuda

我使用cub :: DeviceReduce :: Sum来计算向量的总和,但它给了我错误:

error: calling a __host__ function("cub::DeviceReduce::Sum<double *, double *> ") from a __device__ function("dotcubdev") is not allowed
error: identifier "cub::DeviceReduce::Sum<double *, double *> " is undefined in device code

代码示例如下:

__device__ void sumcubdev(double* a, double *sum, int N)
{
    // Declare, allocate, and initialize device-accessible pointers 
     //for input and output
    // Determine temporary device storage requirements
    void     *d_temp_storage = NULL;
    size_t   temp_storage_bytes = 0;
     cub::DeviceReduce::Sum(d_temp_storage, temp_storage_bytes, a, sum, N);
    // Allocate temporary storage
    cudaMalloc(&d_temp_storage, temp_storage_bytes);
    // Run sum-reduction
     cub::DeviceReduce::Sum(d_temp_storage, temp_storage_bytes, a, sum, N);
}

代码可以在&#34; main {}&#34;中成功运行身体,但它不能在功能中工作。

1 个答案:

答案 0 :(得分:2)

要在设备代码中使用cub设备范围的功能,必须构建项目以支持CUDA动态并行性。在cub documentation中,此处显示:

  

使用注意事项   动态并行。 DeviceReduce方法可以在支持CUDA动态并行性的设备上的内核代码中调用。

例如,您可以编译您显示的代码:

$ cat t1364.cu
#include <cub/cub.cuh>
__device__ void sumcubdev(double* a, double *sum, int N)
{
    // Declare, allocate, and initialize device-accessible pointers
     //for input and output
    // Determine temporary device storage requirements
    void     *d_temp_storage = NULL;
    size_t   temp_storage_bytes = 0;
     cub::DeviceReduce::Sum(d_temp_storage, temp_storage_bytes, a, sum, N);
    // Allocate temporary storage
    cudaMalloc(&d_temp_storage, temp_storage_bytes);
    // Run sum-reduction
     cub::DeviceReduce::Sum(d_temp_storage, temp_storage_bytes, a, sum, N);
}
$ nvcc -arch=sm_35 -dc t1364.cu
$

(CUDA 9.2,CUB 1.8.0)

这意味着CUB将启动子内核以完成工作。

这不是关于如何使用CUDA动态并行(CDP)的完整教程。以上是仅编译命令,省略了链接步骤。关于讨论CDP的cuda标记有很多问题,您可以在两个blog articlesprogramming guide中阅读它,并且有CUDA sample projects显示如何编译并使用它。