2017-07-14 48 views
-1

这是一个错误的标题,但希望我的描述更清晰。我正在管理一个数十年前的建模和模拟应用程序。我们有兴趣编写一些代码在GPU上运行,因为我们相信它会加快模拟速度(是的,我们在时代中非常落后)。我们终于有机会做到这一点(即金钱),所以现在我们要确保我们理解这样做的后果,特别是维持代码。问题是,由于我们的许多用户没有高端GPU(目前),我们仍然需要我们的代码来支持正常的处理和GPU处理(即我相信我们现在将有两组代码执行非常类似的操作)。有没有人需要经历这些,并有任何教训和/或建议,他们想分享?如果有帮助,我们目前的应用程序是用C++开发的,我们正在考虑与NVIDIA合作,并在GPU中编写Cuda。维护/维持两个代码集的风险,一个用于GPU的CPU,需要执行非常类似的功能

+0

我知道这不是一个论坛,但如果其他人有建议/经验教训,请分享(我的团队,我将非常感谢!) –

+0

代码将完全不同。我想几乎不可能产生两组看起来相似并且以某种常见方式模块化的代码。所以你必须支持2个应用程序来代替1. –

+0

另外,正如你所提到的,SO不是一个论坛,你的问题不属于论坛。您可以尝试其他堆栈交换站点,但我认为您的问题对于问答格式来说过于宽泛/复杂。 –

回答

1

这与使用矢量化或其他汇编指令编写手工装配版本类似,同时还保持C/C++版本。有长期在这样做的经验lot,这个建议是基于此。 (我在GPU中做这件事的经验是短期(几年)和更短(几次))。

你会想编写单元测试。

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

该测试运行几个模拟/模型,并声明结果是相同如果可能的话。它们每晚都会运行,并且/或者每次更改代码库作为验收套件的一部分。

这确保了两个代码库不会因为它们不断被执行而变得“陈旧”,而且这两个独立的实现实际上有助于维护另一个代码库。

另一种方法是运行混合解决方案。有时,运行混合的CPU和GPU比其中一个更快,即使它们都解决相同的问题。当你不得不切换技术(比如说,一种新的GPU语言,或者一个分布式设备网络,或者未来20年出现的新技术)时,“更简单”的CPU实现将会成为生命的救星。

+0

这正是我期待的那种建议,谢谢! –