cudaBindTextureToArray和cudaUnbindTexture是否打破了GPU-CPU并发?

时间:2013-04-23 12:04:17

标签: cuda

我希望我的CPU和GPU重叠计算,但是,我的GPU代码包含一些同步函数调用,如cudaBindTextureToArray()cudaUnbindTexture(),其中不存在异步对应项。这些调用会调用GPU-CPU并发吗?

1 个答案:

答案 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())通常可以从他们的描述中看出来。

在单设备系统的环境中,同步功能(除cudaStreamSynchronizecudaStreamWaitEvent等特定流同步功能外)将:

  1. 等待所有cuda活动完成(即所有先前的cuda API调用和内核调用已完成)
  2. 执行指定的活动(例如cudaMemcpy()将在步骤1完成后开始指定的复制操作
  3. 在第2步完成后释放调用(主机)线程
  4. 因此,从cudaMemcpy()调用到所有先前的cuda活动完成 {{1}之前,调用(主机)线程被阻止呼叫完成。我想大多数人会说这可能会“破坏”GPU-CPU的并发性,因为在上述序列的持续时间内(步骤1-3),CPU线程实际上什么都不做。

    它是否对您的应用程序产生很大影响将取决于相关同步调用之前和之后发生的事情。