在我的应用程序中,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 上执行会有所帮助吗?
- 甚至有可能还是我以错误的方式解决问题?