我有一個由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指令。
未經測試,但值得一試:我認爲我之前通過在memcpy之前添加一個assert()來聲明地址是32字節對齊的。一些編譯器可以採取這些提示並使用它們進行優化。 –
我無法用Clang 3.9重新編譯(我收到一堆'vmovaps'),不幸的是我無法嘗試3.8 – harold
@harold如果您一次複製兩個或更多結構,則使用memcpy_avx_unaligned()。一個結構實際上是通過移動指令完成的,在我的情況下它是未對齊的:vmovup(並且它使用了其中的14個)。 – Bram