我正在做一些OpenCL编程,在我的代码中的某个位置我得到了奇怪的错误。
a和a_end是指向本地内存的指针
if (a+POS<=a_end) {
max = ....
} else {
max = *(a_end-1);
}
在我的情况下,在当前循环中未达到“else”。但是,如果该行是代码的一部分,则应用程序将崩溃为-5 CL_OUT_OF_RESOURCES。 如果我评论该线程,该程序运行良好。这很奇怪。
你有什么建议吗?
此致 克里斯
修改:更多代码
a,a_end和POS1崩溃之前的值: a:3298304 a_end:3311264 POS1:34
border=b-b_end; //TODO: Check if all dummy elements are removed in this case
if(POS1<border && a+POS1<a_end) {
s_data[POS1+s_maxes[2]-border+1]=a[POS1];
s_ids[POS1+s_maxes[2]-border+1] = a_pos+POS1;
}
if(POS1+1==border) {
debug[0] = a+POS1;
debug[1] = a_end;
s_maxes[1]=*(b_end-1);
if(a+POS1<=a_end) {
s_maxes[0]=s_data[s_maxes[2]];
} else {
s_maxes[0]=*(a_end-1); //Here is the line where it crashes
}
}
if(POS2<border && a+POS2<a_end) {
s_data[POS2+s_maxes[2]-border+1]=a[POS2];
a_pos+POS2;
}
if(POS2+1==border) {
s_maxes[1]=*(b_end-1);
if(a+POS2<=a_end) {
s_maxes[0]=s_data[s_maxes[2]];
} else {
s_maxes[0]=*(a_end-1);
}
}
a+=border;a_pos+=border;
答案 0 :(得分:0)
很有可能发生以下情况:在if
a_end
的值被破坏之前,很可能它被初始化为0(没有进一步了解代码这是我最好的但它也可能是一个小于a + POS
的值,然后显然会执行else分支,它会尝试取消引用在地址0 - 1
找到的值,这是一个相当大的数字,然后应用程序崩溃。显然,如果删除else分支,则不会执行此代码。
提示:为a_end的值添加一些打印输出。