0

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

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

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

所以问题是:

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

1 回答 1

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

于 2012-10-25T10:55:18.753 回答