Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/64.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
OpenCL CLK_本地_内存_围栏导致中止陷阱6_C_Synchronization_Opencl - Fatal编程技术网

OpenCL CLK_本地_内存_围栏导致中止陷阱6

OpenCL CLK_本地_内存_围栏导致中止陷阱6,c,synchronization,opencl,C,Synchronization,Opencl,我正在做一些关于使用OpenCL对图像()进行卷积的练习。当我使用大小不是正方形的图像(如RxC)时,CLK\u LOCAL\u MEM\u FENCE会使程序停止执行中止陷阱6 我所做的基本上是用适当的值填充本地内存,等待填充本地内存的过程完成,使用barrier(CLK\u local\u MEM\u FENCE)然后计算值 当我使用我告诉过你的关于屏障的图片(CLK\u LOCAL\u MEM\u FENCE)时,如果我评论命令一切正常(这很奇怪,因为没有同步)。什么可能导致这个问题?你知

我正在做一些关于使用OpenCL对图像()进行卷积的练习。当我使用大小不是正方形的图像(如RxC)时,
CLK\u LOCAL\u MEM\u FENCE
会使程序停止执行中止陷阱6

我所做的基本上是用适当的值填充本地内存,等待填充本地内存的过程完成,使用barrier(
CLK\u local\u MEM\u FENCE
)然后计算值

当我使用我告诉过你的关于屏障的图片(
CLK\u LOCAL\u MEM\u FENCE
)时,如果我评论命令一切正常(这很奇怪,因为没有同步)。什么可能导致这个问题?你知道吗

编辑:当高度或宽度或两者都不是本地项目大小(16 x 16)的倍数时,就会出现问题。全局项目大小是16的倍数(512 x 512)

int c=get\u global\u id(0);
int r=获取全局id(1);
int lc=获取本地id(0);
int lr=获取本地id(1);
//这会忽略输入图像中的索引。
如果(c>=图像宽度| r>=图像高度)返回;
//填充本地数组。。。
屏障(CLK_本地_MEM_围栏);
如果(c
OpenCL要求每个工作组屏障由该工作组中的每个工作项执行

在您发布的代码中,有一个early exit子句来防止超出范围的访问。在OpenCL1.X中,这是获得良好工作组大小的常见技巧,但不幸的是,这打破了上述条件,并且这将导致未定义的行为(通常是挂起或崩溃)


您需要修改内核以避免这种情况,方法是删除早期退出子句(如果适用的话,可能会钳制超出范围的工作项),或者通过重新构造内核,使超出范围的工作项在退出之前至少一直延续到屏障。

OpenCL要求每个工作组屏障由该工作组中的每个工作项执行

在您发布的代码中,有一个early exit子句来防止超出范围的访问。在OpenCL1.X中,这是获得良好工作组大小的常见技巧,但不幸的是,这打破了上述条件,并且这将导致未定义的行为(通常是挂起或崩溃)


您需要修改内核以避免这种情况,方法是删除早期退出子句(如果适用的话,可能会钳制超出范围的工作项),或者通过重新构造内核,使超出范围的工作项在退出之前至少一直延续到屏障。

您可以更改代码顺序,而不影响修复它的行为:

int c = get_global_id(0); 
int r = get_global_id(1); 

int lc = get_local_id(0);
int lr = get_local_id(1);

// fill a local array... with all the threads
// ie: for(i=0;i<size;i+=get_local_size(0))
//        ...

barrier(CLK_LOCAL_MEM_FENCE);

// this ignores indexes out of the input image.
if (c >= ImageWidth || r >= ImageHeight) return;

if (c < outputImageWidth && r < outputImageHeight)
{
     // LOCAL DATA PROCESSED  
     OutputImage[r* outputImageWidth +c] = someValue;
}
int c=get\u global\u id(0);
int r=获取全局id(1);
int lc=获取本地id(0);
int lr=获取本地id(1);
//填充本地数组。。。用所有的线
//ie:for(i=0;i=ImageWidth | r>=ImageHeight)返回;
如果(c
您可以更改代码顺序,而不影响修复行为:

int c = get_global_id(0); 
int r = get_global_id(1); 

int lc = get_local_id(0);
int lr = get_local_id(1);

// fill a local array... with all the threads
// ie: for(i=0;i<size;i+=get_local_size(0))
//        ...

barrier(CLK_LOCAL_MEM_FENCE);

// this ignores indexes out of the input image.
if (c >= ImageWidth || r >= ImageHeight) return;

if (c < outputImageWidth && r < outputImageHeight)
{
     // LOCAL DATA PROCESSED  
     OutputImage[r* outputImageWidth +c] = someValue;
}
int c=get\u global\u id(0);
int r=获取全局id(1);
int lc=获取本地id(0);
int lr=获取本地id(1);
//填充本地数组。。。用所有的线
//ie:for(i=0;i=ImageWidth | r>=ImageHeight)返回;
如果(c
没有代码我们怎么猜?也许你没有从工作组中的所有线程调用屏障?请输入代码。您正在循环中使用它,当循环大小不是正方形时,它将挂起。@darkzero您可以查看编辑吗?我从内核中添加了一些伪代码。我不确定这是否取决于我没有在这里编写的代码的实现,但事实是,当我对屏障进行注释时,它似乎工作正常(它不会停止)。看,您遇到了我所期望的问题。只有通过第一个条件的项才会遇到障碍,而不是所有的项都会遇到障碍,因此它会阻止执行并中止。没有代码,我们怎么能猜测呢?也许你没有从工作组中的所有线程调用屏障?请输入代码。您正在循环中使用它,当循环大小不是正方形时,它将挂起。@darkzero您可以查看编辑吗?我从内核中添加了一些伪代码。我不确定这是否取决于我没有在这里编写的代码的实现,但事实是,当我对屏障进行注释时,它似乎工作正常(它不会停止)。看,您遇到了我所期望的问题。障碍只在通过第一个条件的项目中遇到,而不是所有的项目,因此它会阻止执行并中止。这正是我所想的。非常感谢您的确认!这正是我所想的。非常感谢您的确认!