Visual Studio 2015 update 1 (Win10 を対象) で AVX2 コードのデバッグに問題があります。
デバッガーを使用して AVX2 レジスターを検査する場合、ブレークポイントを使用して _mm256_insertf128_ps-intrinsic をステップ オーバーする場合 (たとえば) は、通常のプログラムの実行と比較して内容が異なります。バグは簡単に再現できます。main 関数に次のコードを記述して、新しい Win コンソール アプリケーションを作成するだけです。
1: __m128 lo = _mm_set1_ps(2.0f);
2: __m128 hi = _mm_set1_ps(4.0f);
3: __m256 avx = _mm256_castps128_ps256(lo);
4: avx = _mm256_insertf128_ps(avx, hi, 1);
5: for (int i = 0; i < 8; i++)
6: printf("%.2f\n", avx.m256_f32[i]);
行 4 にブレークポイントを設定し、それをステップオーバーすると、行 5 ~ 6 の印刷ループから次の出力が発生します。
2.00
2.00
2.00
2.00
0.00 <- Wrong!
0.00 <- Wrong!
0.00 <- Wrong!
0.00 <- Wrong!
プログラムを実行すると、次の出力が得られます。
2.00
2.00
2.00
2.00
4.00 <- Correct
4.00 <- Correct
4.00 <- Correct
4.00 <- Correct
MSVC と Intel コンパイラ (バージョン 16) の両方を使用してこれを試しましたが、どちらも同じ動作を示します。
他の誰かがこの問題に遭遇しましたか? これの原因が何であるか知っている人はいますか?回避策はありますか?
前もって感謝します!