[英]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
),則所有編譯器都會給出相同的預期結果。
所以我的問題是:
這看起來像是已修復的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.