簡體   English   中英

SSE和AVX內在混合物

[英]SSE and AVX intrinsics mixture

除了SSE-copy,AVX-copy和std :: copy性能 假設我們需要以下列方式對一些循環進行矢量化:1)通過AVX向量化第一個循環批次(多次乘8)。 2)將循環的剩余部分分成兩批。 通過SSE矢量化批次為4的倍數。 3)通過串行程序處理整個循環的剩余批次。 讓我們考慮復制數組的例子:

#include <immintrin.h>

template<int length,
         int unroll_bound_avx = length & (~7),
         int unroll_tail_avx  = length - unroll_bound_avx,
         int unroll_bound_sse = unroll_tail_avx & (~3),
         int unroll_tail_last = unroll_tail_avx - unroll_bound_sse>
void simd_copy(float *src, float *dest)
{
    auto src_  = src;
    auto dest_ = dest;

    //Vectorize first part of loop via AVX
    for(; src_!=src+unroll_bound_avx; src_+=8, dest_+=8)
    {
         __m256 buffer = _mm256_load_ps(src_);
         _mm256_store_ps(dest_, buffer);
    }

    //Vectorize remainder part of loop via SSE
    for(; src_!=src+unroll_bound_sse+unroll_bound_avx; src_+=4, dest_+=4)
    {
        __m128 buffer = _mm_load_ps(src_);
        _mm_store_ps(dest_, buffer);
    }

    //Process residual elements
    for(; src_!=src+length; ++src_, ++dest_)
        *dest_ = *src_;
}

int main()
{  
    const int sz = 15;
    float *src = (float *)_mm_malloc(sz*sizeof(float), 16);
    float *dest = (float *)_mm_malloc(sz*sizeof(float), 16);
    float a=0;
    std::generate(src, src+sz, [&](){return ++a;});

    simd_copy<sz>(src, dest);

    _mm_free(src);
    _mm_free(dest);
}

使用SSE和AVX是否正確? 我需要避免AVX-SSE過渡嗎?

你可以隨心所欲地混合SSE和AVX內在函數。

您唯一要確定的是指定正確的編譯器標志以啟用AVX。

  • 海灣合作委員會: -mavx
  • Visual Studio: /arch:AVX

如果不這樣做將導致代碼不編譯(GCC),或者在Visual Studio的情況下,
這種廢話:

該標志的作用是強制所有SIMD指令使用VEX編碼來避免上述問題中描述的狀態轉換懲罰。

我謙卑地求求不同 - 我建議盡量不要混合SSE和AVX,請閱讀Mystical寫的鏈接,它警告不要這樣的混合物(盡管沒有足夠強調)。 根據AVX的支持,問題在於不同機器的不同代碼路徑,因此沒有混合 - 在您的情況下,混合是非常精細的並且將是破壞性的(由於微架構實現而導致內部延遲)。

澄清一下 - 神秘對於編譯中的vex前綴是正確的,沒有它你會因為你的YMM寄存器的上半部分不能被忽略而引起SSE2AVX助攻的形狀非常糟糕(除非明確使用vzeroupper)。 但是,即使使用128b AVX與256b AVX混合,也會產生更微妙的效果。

我也沒有看到在這里使用SSE的好處,你有一個很長的循環(比如說N> 100)你可以從大部分時間里獲得AVX的好處,並且在標量代碼中最多可以進行7次迭代。 (你的代碼可能仍然需要做3個)。 與混合AVX / SSE相比,性能損失無關緊要

關於混合物的更多信息 - http://software.intel.com/sites/default/files/m/d/4/1/d/8/11MC12_Avoiding_2BAVX-SSE_2BTransition_2BPenalties_2Brh_2Bfinal.pdf

暫無
暫無

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

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