程序问答   发布时间:2022-06-01  发布网站:大佬教程  code.js-code.com
大佬教程收集整理的这篇文章主要介绍了OpenCL 读取缓冲区核心转储大佬教程大佬觉得挺不错的,现在分享给大家,也给大家做个参考。

如何解决OpenCL 读取缓冲区核心转储?

开发过程中遇到OpenCL 读取缓冲区核心转储的问题如何解决?下面主要结合日常开发的经验,给出你关于OpenCL 读取缓冲区核心转储的解决方法建议,希望对你解决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@ma​​rkers[seedindex] = 255; 时,再次弹出之前描述的相同错误!

请帮忙!

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)

大佬总结

以上是大佬教程为你收集整理的OpenCL 读取缓冲区核心转储全部内容,希望文章能够帮你解决OpenCL 读取缓冲区核心转储所遇到的程序开发问题。

如果觉得大佬教程网站内容还不错,欢迎将大佬教程推荐给程序员好友。

本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。
标签: