РЕДАКТИРОВАТЬ:

Это продолжение ошибки компилятора SSE2

Это настоящая ошибка, с которой я сталкивался раньше и воспроизведенную ниже, изменив оператор _mm_malloc на Майкл Берр предложил:

Необработанное исключение 0x00415116 в SO.exe: 0xC0000005: место чтения нарушения прав доступа 0xffffffff.

На строке label: movdqa xmm0, xmmword ptr [t1+eax]

Я пытаюсь динамически выделить t1 и t2 и в соответствии с этим руководство, я использовал _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;
}
0
Jacob 9 Дек 2009 в 22:59

3 ответа

Лучший ответ

Я думаю, что вторая проблема заключается в том, что вы читаете со смещением от переменной указателя (а не со смещением от того, на что указывает указатель).

Изменить:

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
  }
5
Michael Burr 9 Дек 2009 в 23:16

Вы не выделяете достаточно памяти:

t1 = (int*)_mm_malloc(n * sizeof( int),16);
t2 = (int*)_mm_malloc(n * sizeof( int),16);
5
Michael Burr 9 Дек 2009 в 23:01
Простите, глупая ошибка. Но это не настоящая проблема. Я обновил его сейчас, чтобы воспроизвести ошибку, с которой у меня возникли трудности
 – 
Jacob
9 Дек 2009 в 23:05

Возможно:

t1 = (int*)_mm_malloc(n*sizeof(int),16);
2
Josef Grahn 9 Дек 2009 в 23:02