2017-04-18 26 views
1

我正在生成代碼,我恰好在將n單詞從一個內存位置複製到另一個不重疊的內存位置。 n是靜態的。有多少單詞讓memcpy值得呢?

目前,我發出大量的加載指令後跟着大量的存儲指令,但我懷疑從某個值n開始,調用memcpy會更快。

是否有一個衆所周知的指導方針,你需要複製多少字才能使memcpy值得一個電話?

+2

通常'memcpy'是一個編譯器內在的,這意味着如果你總是使用'memcpy',編譯器應該爲你做出這個決定。 –

+0

因此,即使是複製單個單詞,我也可以合理地使用'memcpy',並且可以不用擔心? –

+2

就我所記得的(我必須優化任何C代碼已經很長時間了,所以我可能會誤解),編譯器通常會將(memcpy)替換爲(例如)一個單詞的等同內聯內存移動(或註冊副本,甚至在某些情況下甚至沒有)。儘管如此,我建議在一個簡單的測試用例上檢查生成的彙編器。 –

回答

1

最優化的代碼將取決於處理器的體系結構。數據路徑,寄存器大小,可用數據寄存器和緩存的數量是決定最優代碼的一些參數。

我不知道你的具體的編譯器將如何應對memcpy功能,但有幾點可以幫助你寫了一個優化的複製代碼:

  • 經常檢查生成的彙編代碼(如果適用)知道當前的代碼是否是最優化的代碼。

  • 如果您有n個數據免費註冊,那麼只加載n值並存儲它們以避免需要從堆棧分配內存。處理寄存器比處理其他記憶要快得多。

  • 如果你的處理器有一些尋址模式,在使用它們後自動增加地址,如果這是你想要做的,那麼確保生成的程序集正在這樣做。

  • 讀取連續的值將提高緩存性能,這將爲您提供更多優化。

  • 盡你所能,嘗試利用加載和存儲指令的完整數據路徑,並且如果SIMD加載和存儲指令可用,請務必使用它們。

相關問題