【发布时间】:2018-07-19 19:53:55
【问题描述】:
The documentation here 试图解释如何处理默认流。
给定这样的代码(忽略分配错误):
char *ptr;
char source[1000000];
cudaMalloc((void**)&ptr, 1000000);
cudaMemcpyAsync(ptr, source, 1000000, cudaMemcpyHostToDevice);
myKernel<<<1000, 1000>>>(ptr);
myKernel 是否会在cudaMemcpyAsync 完成复制之前开始?我认为“否”,因为这是文档中描述的“传统默认流”。
但是,如果我使用CUDA_API_PER_THREAD_DEFAULT_STREAM 编译会发生什么? “每线程默认流”的文本说:
每个线程的默认流是线程和
CUcontext本地的隐式流,并且不与其他流同步(就像显式创建的流一样)。每个线程的默认流不是非阻塞流,如果在程序中同时使用两者,它将与旧的默认流同步。
我认为这也可以,因为cudaMemcpyAsync 和myKernel 都在有效地使用CU_STREAM_PER_THREAD;我说的对吗?
我问的原因是我在内核中有一个非常奇怪的间歇性 CUDA 错误 77,我只能通过 cudaMemcpyAsync 在调用 myKernel 之前没有完成来解释,这意味着我不明白文档。但是,真正的代码太复杂且太专有,无法制作 MCVE。
【问题讨论】: