Cuda 物理引擎需要的建议

Cuda 物理引擎需要的建议,cuda,opencl,game-physics,physics-engine,Cuda,Opencl,Game Physics,Physics Engine,我最近开始了一个项目,建立一个物理引擎。 我希望你能给我一些关于这方面的文档和/或最佳技术的建议 首先,我知道这是对手头任务的强烈推荐,我想知道你是否可以给我第二个意见。我应该得到它吗? 另外,在浏览亚马逊时,我偶然发现了一个问题,因为我想为游戏构建我的物理引擎,我想这可能也是一本不错的书 第二,我知道模拟物理是高度计算密集型的,所以我想使用CUDA或OpenCL。现在我倾向于OpenCL,因为它可以在NVIDIA和ATI芯片组上工作。你们有什么建议 PS:我将在Linux上实现C++。 谢谢

我最近开始了一个项目,建立一个物理引擎。 我希望你能给我一些关于这方面的文档和/或最佳技术的建议

首先,我知道这是对手头任务的强烈推荐,我想知道你是否可以给我第二个意见。我应该得到它吗? 另外,在浏览亚马逊时,我偶然发现了一个问题,因为我想为游戏构建我的物理引擎,我想这可能也是一本不错的书

第二,我知道模拟物理是高度计算密集型的,所以我想使用CUDA或OpenCL。现在我倾向于OpenCL,因为它可以在NVIDIA和ATI芯片组上工作。你们有什么建议

PS:我将在Linux上实现C++。


谢谢。

以下是关于选择CUDA或OpenCL的答案。我没有推荐书

如果您想在NVIDIA和ATI芯片组上运行您的程序,那么OpenCL将使这项工作更容易。但是,您需要编写每个内核的不同版本,以在每个芯片组上获得良好的性能。例如,在ATI卡上,您可能希望使用float4/int4数据类型手动矢量化代码(或接受近4倍的性能损失),而NVIDIA使用标量数据类型的效果更好


如果您只针对NVIDIA,那么CUDA编程会更方便。

以下是关于CUDA或OpenCL选择的答案。我没有推荐书

如果您想在NVIDIA和ATI芯片组上运行您的程序,那么OpenCL将使这项工作更容易。但是,您需要编写每个内核的不同版本,以在每个芯片组上获得良好的性能。例如,在ATI卡上,您可能希望使用float4/int4数据类型手动矢量化代码(或接受近4倍的性能损失),而NVIDIA使用标量数据类型的效果更好


如果您只针对NVIDIA,那么CUDA编程就更方便了。

我建议首先规划一个简单的游戏作为您引擎的测试用例。拥有一个基本的游戏将推动功能和API的开发。在没有明确目标的情况下编写引擎会增加项目的风险。虽然我同意出于性能原因,nVidia和ATi应被视为单独的目标,但我建议您从两者开始

我亲自写了一个物理引擎:德雷克的财富——PS3游戏,我在C++中做了一个操作,当它工作时,通过一个优化来优化它,然后把它放在SPU上。请注意,由于时间的限制,我只做了最初想做的一小部分。在那之后,我进行了一次迭代,将数据阶段分离出来,并形成一个数据转换管道。这一点很重要,因为无论是CPU、GPU还是SPU,运行非平凡代码的现代处理器大部分时间都在等待缓存。您必须特别注意数据结构和管道,以便在任何阶段都有一个小的工作数据集。例如,首先我做broadphase,所以我不需要形状,但我需要世界空间边界框。因此,我将边界框拆分为单独的数组,并在另一个过程中一起计算它们,以最佳方式写出它们。作为bbox计算的输入,我需要形状变换和它们的一些边界,但不一定是整个形状。在broadphase之后,我计算/更新sim岛,同时执行窄相位,我确实需要这些形状。等等——我在一篇文章中用图片描述了这一点

我想我想说的是以下几点:

  • 确保你有一个明确的目标来驱动你的开发-一个非常基本的游戏,用刷新的设计将是最好的游戏物理引擎的情况
  • 在你的产品还没有开始工作之前,不要尝试优化。首先用最简单、最快的方式写,然后修复数学中的所有错误。设计它,以便以后可以将其移植到CUDA,但在屏幕上滚动框之前不要开始编写CUDA内核
  • 在C++中编写第一个PASS后,优化它为CPU:简化它,使它不在缓存中进行,并且将代码划分为没有调用的意大利面,每个阶段的代码都是本地化的。这将有助于a)到CUDA的端口b)到OpenCL的端口c)到控制台的端口d)使它运行得相当快e)使调试成为可能
  • 在开发过程中,要抵制诱惑去做你刚刚想做的事情,除非这个功能对于你的明确目标不是必需的(见#1)——这就是为什么你需要一个目标,来引导你朝着这个目标前进,并使完成实际项目成为可能。分心通常会扼杀没有明确目标的项目
  • 记住,软件开发是迭代的。可以先对其进行粗略的分析,然后再对其进行细化。皮革、冲洗、重复——这是程序员的口头禅:)

  • 提出建议很容易。如果你想做点什么,就去做吧,我们坐下来评论:)

    我建议首先计划一个简单的游戏作为你引擎的测试用例。拥有一个基本的游戏将推动功能和API的开发。在没有明确目标的情况下编写引擎会增加项目的风险。虽然我同意出于性能原因,nVidia和ATi应被视为单独的目标,但我建议您从两者开始

    我亲自写了一个物理引擎:德雷克的财富——PS3游戏,我在C++中做了一个操作,当它工作时,通过一个优化来优化它,然后把它放在SPU上。请注意,由于时间的限制,我只做了最初想做的一小部分。在那之后,我进行了一次迭代,将数据阶段分离出来,并形成一个数据转换管道。这一点很重要,因为无论是CPU、GPU还是SPU,运行非平凡代码的现代处理器大部分时间都在等待缓存。您必须特别注意数据结构