none
YMMレジスタの上位128ビットが意図せず0にクリアされる RRS feed

  • 質問

  • 初めて投稿させていただきます。
    VC++でAVX2をintrinsic関数経由で使おうとしているのですが、
    YMMレジスタの上位128ビットが意図せず0にクリアされてしまい困っています。
    どなたか回避方法をご存じないでしょうか?

    コード1:
    int main() {
      short a[1024];
      for (int i = 0; i < 1024; ++i) a[i] = i;
      __m256i b = _mm256_loadu_si256((const __m256i*)a);
      return 0;
    }

    以上のコードを実行すると、
    bの上位128ビットが0になってしまいます。

    期待される値: {0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15}
    実際の値: {0, 1, 2, 3, 4, 5, 6, 7, 0, 0, 0, 0, 0, 0, 0, 0}

    値はVisual Studio 2015のデバッガでステップ実行中に
    変数を覗いて確かめました。

    コード2:
    int main() {
      short a[1024];
      for (int i = 0; i < 1024; ++i) a[i] = i;
      __m256i b = _mm256_loadu_si256((const __m256i*)a);
      short c[1024];
      _mm256_storeu_si256((__m256i*)c, b);
      return 0;
    }

    コード2はbには意図した通りの値が入ります。

    実験環境
    IDE/Compiler: Visual Studio 2015 Update 1
    CPU: Intel Core i7-5500U

    どうぞよろしくお願いします。
    2015年12月12日 11:08

回答

  • https://connect.microsoft.com/VisualStudio/Feedback/Details/1949147

    既に報告済みの問題のようです。失礼いたしました。

    • 回答としてマーク nod_chip 2015年12月12日 12:18
    2015年12月12日 12:18