0

編集:

これはSSE2コンパイラエラーのフォローアップです

これは私が以前に経験した本当のバグであり、 MichaelBurrが提案したように_mm_mallocステートメントを変更することによって以下に再現しました。

SO.exeの0x00415116で未処理の例外:0xC0000005:アクセス違反の読み取り場所0xffffffff。

ラインでlabel: movdqa xmm0, xmmword ptr [t1+eax]

私は動的に割り当てようとしていますt1t2そしてこのチュートリアルによれば、私は以下を使用しました_mm_malloc

#include <emmintrin.h>
int main(int argc, char* argv[])
{ 
 int *t1, *t2;
 const int n = 100000;
 t1 = (int*)_mm_malloc(n*sizeof(int),16);
 t2 = (int*)_mm_malloc(n*sizeof(int),16);
 __m128i mul1, mul2;
  for (int j = 0; j < n; j++)
  {
  t1[j] = j;
  t2[j] = (j+1);
  } // set temporary variables to random values
  _asm
  {
   mov eax, 0
   label: movdqa xmm0, xmmword ptr [t1+eax]
   movdqa xmm1, xmmword ptr [t2+eax]
   pmuludq xmm0, xmm1
   movdqa mul1, xmm0
   movdqa xmm0, xmmword ptr [t1+eax]
   pshufd xmm0, xmm0, 05fh
   pshufd xmm1, xmm1, 05fh
   pmuludq xmm0, xmm1
   movdqa mul2, xmm0
   add eax, 16
   cmp eax, 100000
   jnge label
  }
     _mm_free(t1);
     _mm_free(t2);

 return 0;
}
4

3 に答える 3

5

十分なメモリを割り当てていません:

t1 = (int*)_mm_malloc(n * sizeof( int),16);
t2 = (int*)_mm_malloc(n * sizeof( int),16);
于 2009-12-09T20:01:40.883 に答える
5

2番目の問題は、ポインター変数からのオフセット(ポインターが指すものからのオフセットではない)で読み取っているということだと思います。

変化する:

label: movdqa xmm0, xmmword ptr [t1+eax]

次のようなものに:

mov ebx, [t1]
label: movdqa xmm0, xmmword ptr [ebx+eax]

同様に、t2ポインタを介したアクセスについても同様です。

これはさらに良いかもしれません(私はそれをテストする機会がなかったので、それはうまくいかないかもしれませんが):

  _asm
  {
   mov eax, [t1]
   mov ebx, [t1]
   lea ecx, [eax + (100000*4)]

   label: movdqa xmm0, xmmword ptr [eax]
   movdqa xmm1, xmmword ptr [ebx]
   pmuludq xmm0, xmm1
   movdqa mul1, xmm0
   movdqa xmm0, xmmword ptr [eax]
   pshufd xmm0, xmm0, 05fh
   pshufd xmm1, xmm1, 05fh
   pmuludq xmm0, xmm1
   movdqa mul2, xmm0
   add eax, 16
   add ebx, 16
   cmp eax, ecx
   jnge label
  }
于 2009-12-09T20:09:32.493 に答える
2

多分:

t1 = (int*)_mm_malloc(n*sizeof(int),16);
于 2009-12-09T20:02:39.843 に答える