首页 > 解决方案 > 计算物理并仅使用 GPU 显示

问题描述

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

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

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

标签: c++gpuopenclhpc

解决方案


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

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

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

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

推荐阅读