РЕДАКТИРОВАТЬ:
Это продолжение ошибки компилятора 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;
}
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
}
Вы не выделяете достаточно памяти:
t1 = (int*)_mm_malloc(n * sizeof( int),16);
t2 = (int*)_mm_malloc(n * sizeof( int),16);
Возможно:
t1 = (int*)_mm_malloc(n*sizeof(int),16);
Похожие вопросы
Связанные вопросы
Новые вопросы
c++
C ++ - это язык программирования общего назначения. Первоначально он был разработан как расширение C и имеет аналогичный синтаксис, но теперь это совершенно другой язык. Используйте этот тег для вопросов о коде (который должен быть) скомпилирован с помощью компилятора C ++. Используйте тег для конкретной версии для вопросов, связанных с конкретной версией стандарта [C ++ 11], [C ++ 14], [C ++ 17], [C ++ 20] или [C ++ 23] и т. Д. .