关于OPENCL控制流,其中IF(false)读取而不是跳过,然后总体调试OpenCL



首先,这是我实际上第一次觉得需要在Stackoverflow上提出一个问题,但是我在橡皮图和黑客入侵自己的OpenCL代码时解决了问题。但是,鉴于我在学习的几个月中发现的OpenCL的有用和平易近人的调试信息很少,我认为写下来的努力可能会帮助其他人,因为解决了我的问题的解决方案对于初学者来说并不明显。

上下文:我正在写一个对C的划线器,但请允许使用OpenCL上学。我已经构建并调试了一个opencl rng库,我可以从简单的内核中调用该库,将一些算法移植到子功能中,但是仍在学习记忆管理和大型算法的分解,以排队。

OS:Xubuntu 18.04平台:Nvidia Cuda |设备:GeForce GTX 950m |版本:Opencl 1.2 Cuda

我在数据中获得了不一致的信息:printf()告诉我,我的数据是我的第二个内核(问题正在发生的)和连贯的;但是它从未达到相应的" if"语句中的检查。更糟糕的是,如果陈述是"错误的",并且鉴于GPU控制流的怪异,我似乎很茫然。

互联网上谈论主题与我得到的主题的两页,但两者都不是我的问题(可能是您的问题):

):

https://community.amd.com/thread/225707

https://computergraphics.stackexchange.com/questions/4115/gpu-branching-if-without-else-else

进行调试,我在子函数中使用了以下片段,该片段将像素的颜色返回到主内核(称为它)。

    if (isequal((float)scene->camera.c_to_w.sF, (float)0.))
    {
        return ((float3)(0., 255., 0.));
    }
    else if (isequal((float)scene->camera.c_to_w.sF, (float)0.5))
    {
        return ((float3)(255., 0., 255.));
    }
    else //if (some other condition)
        return ((float3)(255., 255., 0.));

没有此片段的功能返回了黑屏。否则,它根据以下行为返回了IF语句之一的颜色的屏幕。我分别评论"否则"陈述并使用值,我发现:只要存在这个摘要,其中一个'返回(r,g,b)必然会被读取;如果其中至少一个是正确的,则将读取,否则行为始终是该变量长度的第一个条件。

我的错误是简单的"返回"(result_pixel_color);"在我的get_pixel_color()子函数的末尾。是的,我很愚蠢。

似乎像大多数C编译器一样,OpenCL编译器在返回类型错误之前没有警告您的"控制流量达到了非空隙函数的末端"。在我的情况下,丢失回报的不确定行为采取了将功能中的任何回报作为控制流的总回报的方法。OpenCL编译器可能会在此操作时不会警告您是否会滑下来:对您自己的代码更加批评!

,也可能没有警告您!

这是一个更一般的陈述,但是我觉得这对于学习OpenCL时会遇到一些晦涩的错误的人可能很有用。我的问题是,我高估了OpenCL编译器的帮助,尤其是考虑到我的代码的大小。我们正在尝试使用.CL.H标头的不同.cl文件中的许多子功能,以使其在其体系结构和评论中清晰可见:这是一个团队项目,但我已经知道OpenCL最好...编码大部分时间实际上是要使功能长度长度长,这确实是可维护性和模块化IMO的一个问题。每个文件超过1个内核,每个程序超过1个文件,您开始遇到问题,尤其是在编译中。对于复杂的算法(例如(双向/快速/etc)路径跟踪,它需要建模许多不同类型的大数据,加速结构和排序射线以以工作组连接方式运行相交,您应该永远不要警惕编译器知道您的错误实际上是多么愚蠢/平凡。

相关内容

最新更新