c++ - 计算物理并仅使用 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));
}
解决方案
如果您只观察到 10% 的 GPU 使用率,则问题在于没有发送帧缓冲区。
我做过类似的事情,在 GPU 上进行物理模拟并在 OpenCL 中进行实时渲染,然后通过 PCIe 将位图发送到 CPU,然后通过<Windows.h>
SetBitmapBits
GPU 将位图发送到显示器。这非常有效,并且 GPU 利用率为 100%,示例在此处和此处。您可以通过 OpenCL-OpenGL 互操作性直接在显示器上进行绘图,以提高效率,但这实际上不是必需的,也不会解决您的问题。
解决方案是在 CPU 上创建 2 个线程:
- 计算线程:它在无限循环中运行物理计算,没有任何延迟,并
compute_queue.finish();
在每次迭代中调用 GPU 计算内核。该线程始终使 GPU 保持 100% 的负载。 - 渲染线程:它运行内核来渲染数据,然后将位图复制过来并执行绘图命令到屏幕上。如果整个过程不到 1/60 秒,则调用
Sleep
剩余时间以减少 GPU 上的负载,让它花更多时间在物理计算上。要使这两个线程相互独立,您还应该创建两个 OpenCL 命令队列,一个用于计算线程,一个用于渲染线程。
推荐阅读
- javascript - WebGL:INVALID_OPERATION:uniformMatrix4fv:位置不是来自当前程序
- reactjs - 终端不接受任何命令
- jetbrains-ide - actionlist 中的哪一项操作是 IDE 键盘映射:“显示上下文操作”
- python - 数据校准
- c++ - 在应用程序运行时,使嵌入可执行文件的二进制 blob 作为文件系统文件可访问。C/C++
- django - 是否可以在视图中在 Django 对象上添加新数据?
- c# - 使用 ASP.NET Core MVC 从数据库中提取数据并保存为 Excel 文件
- firebase - Flutter web Firebase 身份验证 URL 重定向
- c# - xml 更改后,与 DynamicResource XmlDataProvider 的网格绑定未更新
- java - ECB 模式:我可以在实体中使用打印方法吗?