SSE2 - Alocação dinâmica alinhada de 16 bytes
-
18-09-2019 - |
Pergunta
EDITAR:
Este é um acompanhamento para Erro do compilador SSE2
Isto é o real bug que experimentei antes e reproduzi abaixo alterando o _mm_malloc
declaração como Michael Burr sugerido:
Exceção não atendida em 0x00415116 em SO.EXE: 0XC0000005: Localização de leitura de violação de acesso ao acesso 0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffs 0xffffffffffffff.
Na linha label: movdqa xmm0, xmmword ptr [t1+eax]
Estou tentando alocar dinamicamente t1
e t2
e De acordo com este tutorial, Eu usei _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;
}
Solução
Eu acho que o segundo problema é que você está lendo em um deslocamento da variável de ponteiro (não um deslocamento do que o ponteiro aponta).
Mudar:
label: movdqa xmm0, xmmword ptr [t1+eax]
Para algo como:
mov ebx, [t1]
label: movdqa xmm0, xmmword ptr [ebx+eax]
E da mesma forma para seus acessos através do ponteiro T2.
Isso pode ser ainda melhor (embora eu não tenha tido a oportunidade de testá -lo, então pode nem funcionar):
_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
}
Outras dicas
Você não está alocando memória suficiente:
t1 = (int*)_mm_malloc(n * sizeof( int),16);
t2 = (int*)_mm_malloc(n * sizeof( int),16);
Talvez:
t1 = (int*)_mm_malloc(n*sizeof(int),16);