我希望我的 CPU 和 GPU 重叠计算,但是,我的 GPU 代码包含一些同步函数调用,例如cudaBindTextureToArray()
不cudaUnbindTexture()
存在异步对应项。这些调用会破坏 GPU-CPU 的并发性吗?
问问题
489 次
1 回答
3
一般来说,可能是异步的函数在这里列出:
- •Kernel launches;
- •Memory copies between two addresses to the same device memory;
- •Memory copies from host to device of a memory block of 64 KB or less;
- •Memory copies performed by functions that are suffixed with Async;
- •Memory set function calls.
异步函数通常有一个Async
后缀,它们通常会接受一个stream
参数。
不符合上述描述的函数应该被认为是同步的。特定的例外(如cudaSetDevice()
)通常从它们的描述中显而易见。
在单设备系统的上下文中,同步函数(除了特定的流同步函数,如cudaStreamSynchronize
和cudaStreamWaitEvent
)将:
- 等到所有 cuda 活动 完成后才开始(即所有以前的 cuda API 调用和内核调用都已完成)
- 执行他们指定的活动(例如将在第 1 步完成后
cudaMemcpy()
开始指定的复制操作) - 第 2 步完成后释放调用(宿主)线程
因此,调用(主机)线程从调用的那一刻起被阻塞,直到所有先前的cudaMemcpy()
cuda 活动完成并且cudaMemcpy()
调用完成。我想大多数人会说这可能会“破坏”GPU-CPU 并发性,因为在上述序列的持续时间内(步骤 1-3),CPU 线程实际上什么都不做。
它是否对您的应用程序产生很大影响将取决于所讨论的同步调用之前和之后发生的情况。
于 2013-04-23T15:05:08.563 回答