簡體   English   中英

將SSE2和AVX內部函數與不同的編譯器混合

[英]Mixing SSE2 and AVX intrinsics with different compilers

是否可以在同一編譯單元中混合使用VEX和非VEX編碼的SIMD內部函數? 我想這樣做是為了簡化將代碼作為單個文件模塊發布到不同的編譯器的過程。

您不需要這樣做,通常最好使用-march=haswell-march=core2文件來構建整個文件,因此可以設置調整選項以及目標指令集。

但是單獨編譯單元使得它更難讓小的內部函數,所以也許這里有一個用例,如果你小心,不要實際上會導致SSE,AVX過渡處罰從混合VEX /非VEX沒有vzeroupper ,或者把VEX-將已編碼的指令編碼到在沒有AVX支持的CPU上運行的代碼路徑中。

IDK在內聯時,編譯器對目標屬性的尊重程度如何,但是鏈接時優化也可以內聯來自使用不同選項編譯的編譯單元的代碼,而AFAIK不會造成問題。


對於GNU C函數屬性,yes 這適用於gcc和clang,但顯然不適用於ICC,即使它不拒絕屬性語法也是如此。

顯然,它不適用於MSVC,后者無論如何都有不同的命令行選項。 使用MSVC,您可以在不使用/arch:AVX情況下編譯使用AVX內在函數的文件,但不要這樣做。 它將僅對舊版SSE根本無法編碼的指令使用VEX編碼,例如_mm_permutevar_psvpermilps ,從而導致過渡處罰。


GNU C方式:

#include <immintrin.h>

__m128 addps_sse(__m128 x, __m128 y) {
    return x+y;       // GNU C alternative to _mm_add_ps.
}

__attribute((target("avx")))    // <<<<<<<<<<< This line
__m128 addps_avx(__m128 x, __m128 y) {
    return x+y;
}

使用gcc和clang -O3 -march=nehalem 編譯(在Godbolt編譯器瀏覽器上) ,這使SSE4.2可用(並針對Nehalem進行了調優),但未啟用AVX。

addps_sse:
        addps   xmm0, xmm1
        ret
addps_avx:
        vaddps  xmm0, xmm0, xmm1
        ret

當然,gcc和clang都發出相同的asm。 ICC對兩個版本都使用addps (非VEX)。 我沒有檢查ICC _mm256在啟用AVX的函數中允許_mm256內部函數,但gcc應該可以。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM