2016-04-08 69 views
2

我有很多以.h和.cu編寫的類,所以我嘗試了可重定位設備代碼(-rdc = true)。它花費大約12秒。然後我試着合併代碼,只使用頭文件類並刪除了-rdc = true,它只用了2秒鐘。當指定-rdc = true時,爲什麼cuda代碼運行速度要慢很多

代碼所做的是sha1(某些字符串)0x40000次,用於winrar加密。

這是爲什麼?現在可以,但是我的項目會變得更大,單獨的編譯會很有用。 -rdc = true是否會降低性能?

回答

2

單獨的編譯可能導致這種放緩。編譯器可能沒有足夠的信息來應用某些優化(所有鏈接時間信息都缺失)。顯然,nvcc仍然沒有在鏈接階段納入這些優化。

+4

如果沒有任何關於代碼本身的信息,很難進行假設。當CUDA編譯器以「完整程序」模式編譯時,它會積極地內聯函數,這常常爲額外優化(常見的子表達式消除,不斷的傳播,更好的負載調度)提供了機會。由於CUDA工具鏈沒有優化鏈接器,因此在使用'-rdc = true'時,不能在編譯單元邊界內嵌內聯函數。調用單獨編譯的函數會導致ABI調用約定的開銷,並且內聯啓用的其他優化不會發生。 – njuffa

2

如果函數的代碼位於單獨的翻譯單元中,而不在您要調用的入口點的標題中,則不會發生內聯。在這種情況下,函數調用會更加昂貴。您可能需要使用內聯關鍵字將您的時間關鍵型功能重新定位到頭文件中,以便編譯器有機會進行內聯。

單獨的編譯可能會使用本地地址空間作爲參數(請參閱參數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關鍵字將一些方法從類實現文件移動到頭文件中以避免鏈接問題可能是一種解決方案。

相關問題