2009-12-09 57 views
0

編輯:SSE2 - 16字節對齊的內存動態分配

這是一個後續到SSE2 Compiler Error

這是真正錯誤我經歷過,並通過改變_mm_malloc聲明轉載如下爲Michael Burr建議:

在0x00415116在SO.exe

未處理的異常:0000005:訪問衝突讀取 位置0xffffffff。

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

我試圖動態分配t1t2according 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 2009-12-09 20:13:54

5

你沒有分配足夠的內存:

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

對不起,愚蠢的錯誤。但這不是真正的**問題。我已經更新它現在重現我有 – Jacob 2009-12-09 20:05:47

2

也許:

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