为什么当指定-rdc = true时cuda代码运行得慢得多

时间:2016-04-08 09:51:15

标签: c++ cuda

我有许多用.h和.cu编写的类,所以我尝试了可重定位的设备代码( -rdc = true )。它花费大约12秒。然后我尝试组合代码,只使用标题类并删除 -rdc = true ,只用了2秒。

代码的作用是sha1(某些字符串)0x40000次,用于winrar加密。

为什么?现在没关系,但我的项目会变得更大,单独的编译会很有用。 -rdc = true 会降低性能是否正常?

2 个答案:

答案 0 :(得分:3)

单独编译可能导致此减速。编译器可能没有足够的信息来应用某些优化(缺少所有链接时间信息)。显然,nvcc仍未在链接阶段纳入这些优化。

答案 1 :(得分:3)

如果功能代码位于单独的翻译单元中,即不在您正在呼叫的入口点的标题中,则不会出现内联。在这种情况下,函数调用将更加昂贵。您可能希望使用inline关键字在头文件中重新定位时间关键函数,以便编译器有机会内联。​​

单独编译可能会产生对参数使用本地地址空间(参见http://docs.nvidia.com/cuda/parallel-thread-execution/index.html#abstracting-abi参数传递),这比寄存器贵得多,如表所示(http://docs.nvidia.com/cuda/parallel-thread-execution/index.html#operand-costs)。

使用inline关键字将类实现文件中的一些方法移动到头文件中以避免链接问题可能是一种解决方案。