2012-10-22 72 views
3

我以前使用SIMD操作符來提高代碼的效率,但是現在我正面臨一個我無法解決的新錯誤。對於這項任務,速度至關重要。陣列錯誤 - 訪問違規讀取位置0xffffffff

數據的大小直到數據導入時纔會知道,並且可能非常小(100個值)或巨大(1000萬個值)。對於後者,代碼工作正常,但是當我使用少於130036個數組值時遇到錯誤。

有誰知道是什麼原因造成這個問題以及如何解決它?

我已附上涉及的(測試)代碼,稍後將用於更復雜的功能。錯誤發生在「arg1List [i] = ...」

#include <iostream> 
#include <xmmintrin.h> 
#include <emmintrin.h> 

void main() 
{ 
    int j; 
    const int loop = 130036; 
    const int SIMDloop = (int)(loop/4); 
    __m128 *arg1List = new __m128[SIMDloop]; 

    printf("sizeof(arg1List)= %d, alignof(Arg1List)= %d, pointer= %p", sizeof(arg1List), __alignof(arg1List), arg1List); 
    std::cout << std::endl; 

    for (int i = 0; i < SIMDloop; i++) 
    { 
     j = 4*i; 
     arg1List[i] = _mm_set_ps((j+1)/100.0f, (j+2)/100.0f, (j+3)/100.0f, (j+4)/100.0f); 
    } 
} 
+0

試試這個報告就像分配值中介:http://social.msdn.microsoft.com/Forums/da/vclanguage/thread/05b765a2-ef2e-4e45-9229-266d7fe55c0f –

+0

與你的問題無關,但'loop/4'將會返回一個'int',不需要這個cast。 – Gorpik

回答

8

調整是原因。

MOVAPS - 移動對齊的壓縮單精度浮點值

[...]操作數必須在16字節邊界或一般保護性異常(#GP)上對齊會被生成。

你可以看到的問題是,你調整你的指針很快就過去了,

__m128 *arg1List = new __m128[SIMDloop + 1]; 
arg1List = (__m128*) (((int) arg1List + 15) & ~15); 
+0

這個工程;非常感謝您的及時回覆。雖然,爲什麼你給數組大小加1? – user1765603

+0

由於0到15個前導字節可能會因指針重新對齊而浪費。爲了彌補這一點,你需要在另一端的一些備用字節... –

+0

好的,謝謝。出於好奇,你知道爲什麼這對於非常大的陣列來說不是問題嗎? – user1765603