大佬教程收集整理的这篇文章主要介绍了OpenCL 读取缓冲区核心转储,大佬教程大佬觉得挺不错的,现在分享给大家,也给大家做个参考。
我为图像处理任务编写了一个内核。 我在 Fedora linux 系统上工作,使用 NVIDIA GTX 1660 TI 显卡。
在某些时候,我将一个大的无符号字符数组作为内核参数发送,它代表一个彩色图像。
问题在于下面的markersImageBuffer。 这样做:
cl::Buffer inDicesBuffer(context,CL_MEM_READ_ONLY | CL_MEM_copY_HOST_PTR,inDices.size() * sizeof(int),inDices.data());
cl::Buffer inDicesCountBuffer(context,inDicesCount.size() * sizeof(int),inDicesCount.data());
cl::Buffer gradIEntimageBuffer(context,nbElems * sizeof(unsigned char),img.gradIEntRAW.data());
cl::Buffer markersImageBuffer(context,CL_MEM_READ_WRITE,nbElems * sizeof(unsigned char));
// set kernel parameters
markersKernel.setArg(0,img.wIDth);
markersKernel.setArg(1,img.height);
markersKernel.setArg(2,inDicesBuffer);
markersKernel.setArg(3,inDicesCountBuffer);
markersKernel.setArg(4,gradIEntimageBuffer);
markersKernel.setArg(5,markersImageBuffer);
// launch kernel on the compute device
queue.enqueuEndRangeKernel(markersKernel,cl::NullRange,grID.cellCenters,cl::NullRangE);
// get result BACk to host
queue.enqueueReadBuffer(markersImageBuffer,CL_TRUE,grID.markersRAW.data());
enqueueReadBuffer 命令给我一个核心转储: 在抛出 'cl::Error' 实例后调用终止 what(): clEnqueueReadBuffer 放弃(核心转储)
我不明白,因为变量 nbElems 设置为 (img.wIDth * img.height * 3), 在 GPU 代码上,我检查了我是否不越过该缓冲区的边界以防万一。
这是填充标记缓冲区内的一些数据的 GPU 代码的最开始:
voID colorMaxRegion(
const int wIDth,const int height,const int maxIndex,const int starTindex,const int endindex,enum LAST_VISITED visited,global const int* inDices,global const unsigned char* gradIEnt,const int minGradIEnt,global unsigned char* markers)
{
bool correctSeed = false;
for(int i = starTindex; i < endindex; ++i)
{
if(maxIndex == inDices[i])
correctSeed = true;
}
if(correctSeed)
{
int value = (gradIEnt[maxIndex] == minGradIEnt) ? 1 : 0;
if(value == 0)
return;
if(maxIndex < (wIDth * height * 3))
{
markers[maxIndex] = 0;
markers[maxIndex + 1] = 255;
markers[maxIndex + 2] = 0;
}
编辑: 在内核函数中,当我为某些像素设置颜色时:
// get seed giving the max area
int maxSeed = -1;
int maxArea = -1;
int area;
int seedindex;
for(int i = offset; i < (offset + pixelCount); ++i)
{
seedindex = inDices[i];
if(gradIEnt[seedindex] == minGradIEnt)
{
area = growRegion(wIDth,height,seedindex,offset,offset + pixelCount,ROOT,inDices,gradIEnt,minGradIEnt);
if(area > maxArea)
{
maxArea = area;
maxSeed = seedindex;
}
markers[seedindex] = 255;
}
}
return;
一切正常,我在这里和那里看到了红点。 但是当我在 if (area > maxArea) 语句中移动指令 @H_525_13@markers[seedindex] = 255; 时,再次弹出之前描述的相同错误!
请帮忙!
暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!
如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。
小编邮箱:dio#foxmail.com (将#修改为@)
以上是大佬教程为你收集整理的OpenCL 读取缓冲区核心转储全部内容,希望文章能够帮你解决OpenCL 读取缓冲区核心转储所遇到的程序开发问题。
如果觉得大佬教程网站内容还不错,欢迎将大佬教程推荐给程序员好友。
本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。