2017-11-10 112 views
3

我有一個由7個__m256值組成的結構,它存儲在內存中的32字節對齊。提示編譯器可以使用對齊的memcpy

typedef struct 
{ 
     __m256 xl,xh; 
     __m256 yl,yh; 
     __m256 zl,zh; 
     __m256i co; 
} bloxset8_t; 

我通過使用posix_memalign()函數動態分配的數據,或者使用用於靜態分配數據的(aligned(32))屬性實現32字節對齊。

對齊方式很好,但是當我使用兩個指向這樣一個結構體的指針,並將它們作爲memcpy()的目標和源代碼傳遞時,編譯器決定使用__memcpy_avx_unaligned()進行復制。

我該如何強制clang使用對齊的avx memcpy函數,而我認爲這是更快的變體?

操作系統:Ubuntu 16.04.3 LTS,Clang:3.8.0-2ubuntu4。

UPDATE
的__memcpy_avx_unaligned()複製兩個或更多個結構,當僅調用。當只複製一個時,clang會發出14個vmovup指令。

+0

未經測試,但值得一試:我認爲我之前通過在memcpy之前添加一個assert()來聲明地址是32字節對齊的。一些編譯器可以採取這些提示並使用它們進行優化。 –

+0

我無法用Clang 3.9重新編譯(我收到一堆'vmovaps'),不幸的是我無法嘗試3.8 – harold

+0

@harold如果您一次複製兩個或更多結構,則使用memcpy_avx_unaligned()。一個結構實際上是通過移動指令完成的,在我的情況下它是未對齊的:vmovup(並且它使用了其中的14個)。 – Bram

回答

6

__memcpy_avx_unaligned只是一個內部的glibc函數名稱。這並不意味着有更快的__memcpy_avx_aligned函數。這個名字只是向glibc開發者傳達了這個memcpy變體是如何實現的。

另一個問題是,C編譯器使用四個AVX2加載/存儲操作發出memcpy的內聯擴展會更快。該代碼將比memcpy呼叫更大,但總體來說可能會更快。有可能幫助編譯器使用__builtin_assume_aligned builtin來做到這一點。

+0

謝謝。我注意到如果memcpy只有1個結構,則使用14條移動指令。我能夠強制他們從未對齊的移動到構造'__builtin_assume_aligned()'的對齊移動如果您可以添加對此的引用,我可以接受這個答案。 – Bram

相關問題