我正在研究OpenCL,我在MS VS 2012中编码如此:
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];
}
}
该程序也可以构建。这一次,它在运行&#34; for&#34;时崩溃了。循环。
停在PixVectIn[a*800+b].x=PixVect[a][b][0];
。它显示了相同的错误代码,此时a = 600和b = 252。看起来它达到了界限。
我不确定。这可能是因为我更改了项目属性中的某些选项。
答案 0 :(得分:2)
首先,您应该将返回的指针malloc
与NULL
进行比较,否则您不知道分配是否成功。
其次你的指数是错误的:PixVectIn[a*800+b]
将超出480000的界限,因为你的a
单独上升到800,而800 ^ 2是> 480000.也许你的意思是a*b
?
答案 1 :(得分:1)
增加堆栈大小或将该数组声明为静态或将其置于全局范围内。您的堆栈(在您的情况下)不够大,无法处理1920000字节......
答案 2 :(得分: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);