【发布时间】:2018-02-02 22:05:34
【问题描述】:
根据official CUDA doc,我们有
__host__ __device__ cudaError_t cudaMemcpyAsync ( void* dst, const void* src, size_t count, cudaMemcpyKind kind, cudaStream_t stream = 0 )
这意味着它既是主机功能又是设备功能。但是,在我本地 Linux 机器上的实际安装中,我在/usr/local/cuda/include/cuda_runtime_api.h 中看到:
/** CUDA Runtime API Version */
#define CUDART_VERSION 9000
// Many lines away...
extern __host__ __cudart_builtin__ cudaError_t CUDARTAPI cudaMemcpyAsync(void *dst, const void *src, size_t count, enum cudaMemcpyKind kind, cudaStream_t stream __dv(0));
这似乎暗示它严格来说是一个主机功能。
我尝试编译一个调用cudaMemcpyAsync()的简单内核,结果报错
streaming.cu(338):错误:调用 __host__ 来自 __global__ 的函数(“cudaMemcpyAsync”) 不允许使用函数(“loopy_plus_one”)
这是另一个证据。
所以我真的很困惑:是文档不正确,还是我的 CUDA 安装过时了?
编辑:更新 - 如果我将编译命令更改为明确指定 sm_60,即nvcc -arch=sm_60 -o out ./src.cu,则编译错误消失,但会弹出一个新错误:
ptxas 致命:未解析的外部函数“cudaMemcpyAsync”
【问题讨论】:
-
任何时候您尝试使用设备运行时,您都应该在您的
sm_60案例中链接-lcudadevrt,您是否与该链接?在编程指南中,cudaMemcpyAsync是设备运行时的一部分(请参阅here),如果您正在为 3.5 或更高的计算能力进行编译,并链接到设备运行时,并且使用-rdc=true