如何将DirectX专用于GPU并将CUDA专用于其他GPU?

时间:2012-08-20 12:20:59

标签: cuda direct2d multiple-gpu

在我的应用程序中,GUI线程使用Direct2D显示图像,允许用户进行平移和缩放,而另一个线程使用CUDA进行图像处理。为了防止图形处理线程受到GUI线程的干扰并加快速度,我们选择为CUDA计算添加一个单独的图形卡,具有以下设置:

  • 用于显示器的Nvidia Quadro 400(Direct2D,随PC一起销售,足以用于显示目的)
  • 专为CUDA计算的Nvidia GT640(专为CUDA计算而添加,因为它具有更多内核,因此对于应用程序必须执行的操作更有效,禁用在BIOS中显示,不附加屏幕)。 CUDA线程包含使其仅使用此GT640的代码。

然而,这没有按预期工作,因为当用户平移图像,从而导致连续几次更新显示时,CUDA执行时间从典型的20ms跳到大约800ms。使用GPUView(我发现调查此问题并且根本没有掌握),我能够看到CUDA线程似乎在等待显示器完成更新,然后将其命令排队到GPU。与此同时,Direct2D大部分时间都不使用GPU(16ms VSync周期为1ms工作)。看起来我对Direct2D的调用阻塞了所有GPU 16ms,然后GUI线程让CUDA线程挨饿(尽管这些线程没有以GPU访问以外的任何方式同步)。

所以问题是:

  • 会发生什么事?
  • 强制Direct2D仅在一个特定的GPU上执行会有帮助吗?
  • 是否可能或者我是以错误的方式解决问题?

1 个答案:

答案 0 :(得分:1)

如果使用ID2D1DeviceContext渲染目标而不是ID2D1HWndRenderTarget,则在初始化期间,选择要用于Direct3D的适配器。

http://msdn.microsoft.com/en-us/library/windows/desktop/hh780339(v=vs.85).aspx

请参阅D3D11CreateDevice或D3D11CreateDeviceAndSwapChain的文档。 第一个参数指定要使用的适配器。 http://msdn.microsoft.com/en-us/library/windows/desktop/ff476082(v=vs.85).aspx