cuda::不允许从设备函数调用主机函数时发生cub错误

cuda::不允许从设备函数调用主机函数时发生cub错误,cuda,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 *

我使用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

代码可以在“main{}”主体中成功运行,但无法在函数中运行。

要使用设备代码中的cub设备范围函数,必须构建项目以支持CUDA动态并行。在中,此处指出了这一点:

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

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

$ 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
$
$cat t1364.cu
#包括
__设备无效sumcubdev(双*a,双*sum,整数N)
{
//声明、分配和初始化设备可访问指针
//用于输入和输出
//确定临时设备存储要求
void*d_temp_storage=NULL;
大小\u t温度\u存储\u字节=0;
cub::DeviceReduce::Sum(d_temp_storage,temp_storage_bytes,a,Sum,N);
//分配临时存储
cudaMalloc(&d_临时存储,临时存储字节);
//运行和缩减
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)的完整教程。以上仅是compile命令,省略了链接步骤。在
cuda
标签上有许多关于CDP的问题,您可以在两个和中阅读,还有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
$