我已经用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。
还在那里等待他们的反馈。
1条答案
按热度按时间elcex8rz1#
你有没有试过在CPU上运行一个纯C库实现,比如AdaptiveCpp?那么你应该能够使用常用的C CPU调试工具,比如UBsan,ThreadSanitizer,Valgrind,等等。