计算物理并仅使用 GPU 显示

Computing physics and displaying it with GPU only

所以基本上,我最近学习了 OpenCL,并且利用这种新发现的功能,我进行物理模拟的速度提高了大约 10 倍。问题是,我只使用了 10% 的 GPU。我假设这是因为我在将数据发送回 GPU 之前将数据发送回 CPU/Ram,以便可以显示。任何人都知道如何避免这种情况?我有点想为我的图形使用 OpenCL,但有件事告诉我这是个坏主意——就上下文而言,我从未使用过 OpenGL。顺便说一句,这都是在 C++ 中。这是我的代码的伪代码示例:

void start()
{
    CreateKernel();
    SendDataToKernel();
}

void update()
{
    RunKernel();
    float x,y = ReadDataFromKernel();
    Draw(std::round(x), std::round(y));
}

如果您只观察到 10% 的 GPU 使用率,则问题在于没有发送帧缓冲区。

我做过类似的事情,在 GPU 上进行物理模拟并在 OpenCL 中进行实时渲染,然后通过 PCIe 将位图发送到 CPU 并通过 <Windows.h> 发送到显示器 SetBitmapBits, 回到 GPU。这非常有效,GPU 利用率为 100%,示例为 here and here。 您可以通过 OpenCL-OpenGL 互操作性直接在显示器上绘图以提高效率,但这确实没有必要,也不会解决您的问题。

解决方案是在 CPU 上创建 2 个线程:

  1. 计算线程:它在无限循环中运行物理计算,没有任何延迟,并在每次迭代中调用 GPU 计算内核和 compute_queue.finish();。此线程始终使 GPU 保持 100% 负载。
  2. 渲染线程:运行内核渲染数据,然后复制位图并执行绘图命令到屏幕。如果整个过程用时少于 1/60 秒,则在剩余时间调用 Sleep 以减少 GPU 的负载,让它花更多的时间在物理计算上。 为了使这两个线程相互独立,您还应该创建两个 OpenCL 命令队列,一个用于计算线程,一个用于渲染线程。