2015-11-12 87 views
1

大陣列上我在MS VS 2012工作OpenCL和我這樣的代碼:崩潰在C++

cl_float test[480000]; 

它可以成功地遵守,但程序崩潰時,它進入其上面的代碼是功能英寸錯誤代碼:0xC000041D。

被中斷近的文件 「chkstk.asm」 結尾:

; Find next lower page and probe 
cs20: 
     sub  eax, _PAGESIZE_   ; decrease by PAGESIZE 
     test dword ptr [eax],eax  ; probe page. 
     jmp  short cs10 

_chkstk endp 

     end 

就行test dword ptr [eax],eax ; probe page.。我不認爲這個數組太大而不能分配。


所以接下來,我想嘗試另一種方式:

cl_float4 *PixVectIn=(cl_float4*)malloc(480000*sizeof(cl_float4)); 
for(unsigned int a=0;a<800;a++){ 
    for(unsigned int b=0;b<600;b++){ 
     PixVectIn[a*800+b].x=PixVect[a][b][0]; 
     PixVectIn[a*800+b].y=PixVect[a][b][1]; 
     PixVectIn[a*800+b].z=PixVect[a][b][2]; 
    } 
} 

該程序還可以建立。這次,運行「for」循環時會崩潰。

它停在PixVectIn[a*800+b].x=PixVect[a][b][0];。它顯示了相同的錯誤代碼,此時a = 600和b = 252。看起來它到達了一個邊界的東西。

我不確定。這可能是因爲我改變了項目屬性中的某些選項。

+2

對於第一,1MB是一個典型的堆棧大小的限制,並且該陣列是比較大的。對於第二個,600 * 800 + 252大於480000. – immibis

+0

[C++中是否存在最大數組長度限制?](http://stackoverflow.com/a/216731/14065) –

回答

2

首先你應該比較指針mallocNULL返回,否則你不知道分配是否成功。

其次你的指數是錯誤的:PixVectIn[a*800+b]會走出48萬的範圍,因爲你a單獨上升到800,和800^2> 480000.也許你的意思a*b

+0

可能是指* 600 + b 。 – immibis

+0

好的,我明白了。我犯了一個簡單的錯誤。這很愚蠢......我想要做PixVectIn [b * 800 + a]'。謝謝。 – Soban

1

提高您的堆棧大小或聲明數組作爲靜態或將其放置在全局範圍內。您的堆棧(在您的情況下)不足以處理1920000字節...

+1

更好的是,該數組應該是一個(動態分配的)堆數據。例如,通過使用'std :: vector' –

+0

@Basile:你的建議很好。我不知道OpenCL是否可以與std:vector或類似的工作。任何信息? – Malkocoglu

+1

閱讀更多關於C++ 11 [std :: vector](http://www.cplusplus.com/reference/vector/vector/)。你可以使用它的'data'成員函數來獲取一個指針。您可能想要將您的編譯器升級到符合C++ 11標準的版本 –

1

第一個程序被堆棧溢出咬傷。

對於第二個,a*800+b是訪問衝突像799,800*800 + 600 > 480000值。

而且更好替換此:

cl_float4 *PixVectIn=(cl_float4*)malloc(480000*sizeof(cl_float4)); 

與此:

std::vector<cl_float4> PixVectIn(480000);