我使用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;中成功运行身体,但它不能在功能中工作。
答案 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 articles和programming guide中阅读它,并且有CUDA sample projects显示如何编译并使用它。