簡體   English   中英

std :: AVX內部函數數組

[英]std::array of AVX intrinsics

我不知道我對AVX內在函數如何與std::array一起工作時是否缺乏了解,但是當我將兩者結合時,我對Clang遇到了一個奇怪的問題。

樣例代碼:

std::array<__m256, 1> gen_data()
{
    std::array<__m256, 1> res;
    res[0] = _mm256_set1_ps(1);
    return res;
}

void main()
{
    auto v = gen_data();
    float a[8];
    _mm256_storeu_ps(a, v[0]);
    for(size_t i = 0; i < 8; ++i)
    {
        std::cout << a[i] << std::endl;
    }
}

來自Clang 3.5.0的輸出(前4個浮點數是垃圾數據):

1
1
1
1
8.82272e-39
0
5.88148e-39
0

GCC 4.8.2 / 4.9.1的輸出(預期):

1
1
1
1
1
1
1
1

如果我改為將v傳遞給gen_data作為輸出參數,則在兩個編譯器上都可以正常工作。 我願意接受這可能是Clang中的錯誤,但是我不知道這是否可能是未定義的行為( UB )。 現在,使用Clang 3.7 *(svn構建)和Clang進行測試似乎可以得出我預期的結果。 如果我切換到SSE 128位內在函數( __m128 ),則所有編譯器都會給出相同的預期結果。

所以我的問題是:

  1. 這里有UB嗎? 還是這只是Clang 3.5.0中的錯誤?
  2. 我的理解__m256只是一個32字節對齊的內存塊正確嗎? 還是我需要特別注意的其他事情?

這看起來像是已修復的clang錯誤,我們可以從此錯誤報告中看到這一點,該錯誤演示了使用常規數組的非常相似的問題。

假設std::array實現類似於以下的存儲:

T elems[N];

libc++libstdc++似乎都可以做到這一點,那么這應該類似。 評論之一說:

但是,libc ++的std::array<__m256i, 1>在任何優化級別上均不起作用。

錯誤報告實際上基於以下SO問題: 使用__m256值數組生成的錯誤代碼是否是clang錯誤? 這非常相似,但是處理常規數組的情況。

錯誤報告包含一種可能的解決方法,OP指出該解決方法就足夠了:

在我的實際代碼中, num_vectors是根據simd_pack類型的某些C ++模板參數計算得出的。 在許多情況下,得出的結果為1,但通常也大於1。 我可以嘗試引入模板特殊化,以捕獲num_vectors == 1的情況。 相反,它可以只使用單個__m256成員,而不是大小為1的數組。我將不得不檢查它的可行性。

暫無
暫無

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

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