2009-12-09 2 views
0

EDIT:SSE2 - 16 байт, выровнен динамическое распределение памяти

Это продолжение к SSE2 Compiler Error

Это реальная ошибка я испытал раньше, и приводится ниже, изменив _mm_malloc заявление а Michael Burr предложил:

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

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

Я пытаюсь динамически выделять t1 и t2 и according to this tutorial, я использовал _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; 
} 

ответ

5

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

Изменение:

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 
    } 
+0

Теперь она работает :) – Jacob

5

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

t1 = (int*)_mm_malloc(n * sizeof(int),16); 
t2 = (int*)_mm_malloc(n * sizeof(int),16); 
+0

К сожалению, глупая ошибка. Но это не настоящая ** проблема. Я обновил его сейчас, чтобы воспроизвести ошибку, с которой я столкнулся с – Jacob

2

Возможно:

t1 = (int*)_mm_malloc(n*sizeof(int),16); 
Смежные вопросы