2009-12-09 56 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);