c++ SYCL -无法找到内存损坏的来源

niwlg2el  于 11个月前  发布在  其他
关注(0)|答案(1)|浏览(76)

我已经用SYCL写了几个星期的光线跟踪器,但是我现在面临一个内存损坏的问题,我真的找不到它来自哪里。
我正在使用英特尔oneAPI基础工具包和Visual Studio Community 2022 17.7.6操作Windows 11 22 H2。
在Windows上,输出图像明显损坏。
在Ubuntu 20.04上(使用oenAPI Base Toolkit 2023.2.1),输出图像看起来很好,但我假设损坏仍然存在,因为它当使用gpu_selector_v在GPU上执行代码时,(几乎总是)崩溃我的英特尔图形驱动程序在Ubuntu的CPU上,输出图像是正常的,似乎没有任何损坏的问题(它可能仍然存在,只是没有显示)。
在Ubuntu上,我尝试使用valgrind来监控CPU上的应用程序,但它找不到任何内存读/写违规。没有错误报告。
在Windows上,DrMemory(valgrind等效)在执行代码时崩溃(pastebin of the crash here),因此不会报告错误的来源。
x1c 0d1x的数据
此损坏问题仅在启用优化(Visual Studio上为/02)的发布模式下编译时出现。在禁用优化的编译模式或发布模式下似乎没有问题。
我设法将问题缩小到render_kernel.cpp:104中从render_kernel.cpp:60调用的一行代码:

bool RenderKernel::intersect_scene(const Ray ray, HitInfo& closest_hit_info) const
{
    float closest_intersection_distance = -1.0f;
    bool inter_found = false;

    for (int i = 0; i < m_triangle_buffer_access.size(); i++)
    {
        const Triangle& triangle = m_triangle_buffer_access[i];

        HitInfo hit_info;
        if (triangle.intersect(ray, hit_info))
        {
            if (hit_info.t < closest_intersection_distance || !inter_found)
            {
                closest_intersection_distance = hit_info.t;
                
                ///////////
                closest_hit_info = hit_info; //Problematic line
                ///////////

                inter_found = true;
            }
        }
    }

    return inter_found;
}

字符串
在上面的图片中,即使是红色背景也有伪影。如果你注解了将交集信息分配给输出'closest_hit_info'参数的行(上面代码片段中的第18行),你显然再也看不到三角形了,因为命中信息没有更新,但红色背景也不再充满伪影。
将反弹次数减少到4次以下(render_kernel.h)也可以解决这个问题。4次或5次反弹总是会在输出图像中显示伪影,而3次或更少的反弹不会显示任何问题。这几乎没有意义,因为场景甚至没有足够的几何体来发生反弹,所以执行应该与2次或更多反弹相同。
完整的代码库可以在this repo中找到,在分支“MinimalCorruption”上。
如果需要更多关于我的系统/安装的细节,请随时询问。

编辑(11/14/2023):问题正在跟踪on the Intel forum

还在那里等待他们的反馈。

elcex8rz

elcex8rz1#

你有没有试过在CPU上运行一个纯C库实现,比如AdaptiveCpp?那么你应该能够使用常用的C CPU调试工具,比如UBsan,ThreadSanitizer,Valgrind,等等。

相关问题