我希望我的CPU和GPU重叠计算,但是,我的GPU代码包含一些同步函数调用,如cudaBindTextureToArray()
和cudaUnbindTexture()
,其中不存在异步对应项。这些调用会调用GPU-CPU并发吗?
答案 0 :(得分:3)
通常,可以异步的函数列出here:
- •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
等特定流同步功能外)将:
cudaMemcpy()
将在步骤1完成后开始指定的复制操作)因此,从cudaMemcpy()
调用到所有先前的cuda活动完成和 {{1}之前,调用(主机)线程被阻止呼叫完成。我想大多数人会说这可能会“破坏”GPU-CPU的并发性,因为在上述序列的持续时间内(步骤1-3),CPU线程实际上什么都不做。
它是否对您的应用程序产生很大影响将取决于相关同步调用之前和之后发生的事情。