maintaining/sustaining 两个代码集的风险,一个用于 CPU 一个用于 GPU,需要执行非常相似的功能

Risks of maintaining/sustaining two code sets, one for CPU one for GPU, that need to perform very similar functions

这个标题不好,但希望我的描述更清楚。我正在管理一个已有数十年历史的建模和仿真应用程序。很长一段时间以来,我们一直对在 GPU 上向 运行 编写一些代码感兴趣,因为我们相信这会加快模拟速度(是的,我们落后于时代)。我们终于有机会做到这一点(即金钱),所以现在我们要确保我们了解这样做的后果,特别是维持代码。问题是,由于我们的许多用户没有高端 GPU(目前),我们仍然需要我们的代码来支持正常处理和 GPU 处理(即我相信我们现在将有两组代码执行非常相似的操作).有没有人经历过这一切,并且有任何经验教训 and/or 他们想分享的建议?如果有帮助,我们当前的应用程序是用 C++ 开发的,我们正在考虑与 NVIDIA 一起使用 Cuda 为 GPU 编写。

这类似于使用矢量化或其他汇编指令编写手工制作的汇编版本,同时还保持 C/C++ 版本。有 很多 长期这样做的经验,这个建议就是基于此。 (我用 GPU 案例做这件事的经验是短期(几年)和更小(几个案例))。

您将需要编写单元测试。

单元测试使用 CPU 实现(因为我还没有找到它们不简单的情况)来测试 GPU 实现。

测试 运行 有一些 simulations/models,并断言如果可能,结果 相同。这些 运行 每晚 and/or 作为验收套件的一部分对代码库进行的每次更改。

这确保了两个代码库不会 "stale" 因为它们经常被使用,并且两个独立的实现实际上有助于维护另一个。

另一种方法是 运行 混合解决方案。有时 运行混合使用 CPU 和 GPU 比其中一个更快,即使它们都在解决相同的问题。

当您必须切换技术时(例如,切换到新的 GPU 语言,或切换到分布式设备网络,或未来 20 年出现的任何新奇事物),"simpler" CPU 实施将是救命稻草。