RenderKit / ospray

An Open, Scalable, Portable, Ray Tracing Based Rendering Engine for High-Fidelity Visualization
http://ospray.org
Apache License 2.0
982 stars 178 forks source link

Floating point exceptions #503

Closed sankhesh closed 2 years ago

sankhesh commented 2 years ago

There are multiple floating point exceptions when rendering with vtkFloatingPointExceptions::Enable

502 fixes some of them but I still see the following:

54      0x7fd1d3bab619 vtkRenderWindow::Render() + 979
53      0x7fd1d3bab82e vtkRenderWindow::DoStereoRender() + 258
52      0x7fd1d3be31a0 vtkRendererCollection::Render() + 232
51      0x7fd1d3bca17d vtkRenderer::Render() + 3449
50      0x7fd1d5ec092b vtkOpenGLRenderer::DeviceRender() + 1611
49      0x7fd1d69da8cb vtkOSPRayPass::Render(vtkRenderState const*) + 713
48      0x7fd1d5d82025 vtkCameraPass::Render(vtkRenderState const*) + 2019
47      0x7fd1d5f61fe5 vtkSequencePass::Render(vtkRenderState const*) + 161
46      0x7fd1d69dc851 /home/sankhesh/Projects/vtk/bld/lib/libvtkRenderingRayTracing-9.0.so.1(+0x67851) [0x7fd1d69dc851]
45      0x7fd1d69dad25 vtkOSPRayPass::RenderInternal(vtkRenderState const*) + 1033
44      0x7fd1d5a41d94 vtkViewNode::TraverseAllPasses() + 102
43      0x7fd1d69ef2a8 vtkOSPRayRendererNode::Traverse(int) + 1950
42      0x7fd1d5a41e39 vtkViewNode::Traverse(int) + 161
41      0x7fd1d5a41dda vtkViewNode::Traverse(int) + 66
40      0x7fd1d5a421a2 vtkViewNode::Apply(int, bool) + 162
39      0x7fd1d69e5dea vtkOSPRayPolyDataMapperNode::Render(bool) + 712
38      0x7fd1d69e56eb vtkOSPRayPolyDataMapperNode::ORenderPoly(void*, vtkOSPRayActorNode*, vtkPolyData*, double*, double*, double, std::string) + 11877
37      0x7fd1d6a0818e /home/sankhesh/Projects/vtk/bld/lib/libvtkRenderingRayTracing-9.0.so.1(+0x9318e) [0x7fd1d6a0818e]
36      0x7fd1d59e0a64 ospCommit + 615
35      0x7fd1c524b765 ospray::api::ISPCDevice::commit(osp::ManagedObject*) + 47
34      0x7fd1c527ae40 ospray::Group::commit() + 1270
33      0x7fd1b5fb1c3d rtcCommitScene + 45
32      0x7fd1b5fe6b6a /home/sankhesh/Projects/ospray/install/lib/libembree3.so.3(+0xe0b6a) [0x7fd1b5fe6b6a]
31      0x7fd1cec6a1ad tbb::detail::r1::isolate_within_arena(tbb::detail::d1::delegate_base&, long) + 230
30      0x7fd1cec77657 /home/sankhesh/Projects/ospray/install/lib/intel64/gcc4.8/libtbb_debug.so.12(+0x1d657) [0x7fd1cec77657]
29      0x7fd1cec668b1 /home/sankhesh/Projects/ospray/install/lib/intel64/gcc4.8/libtbb_debug.so.12(+0xc8b1) [0x7fd1cec668b1]
28      0x7fd1b5fe9b3b /home/sankhesh/Projects/ospray/install/lib/libembree3.so.3(+0xe3b3b) [0x7fd1b5fe9b3b]
27      0x7fd1cec9ee7a tbb::detail::r1::wait(tbb::detail::d1::wait_context&, tbb::detail::d1::task_group_context&) + 43
26      0x7fd1cec9e557 /home/sankhesh/Projects/ospray/install/lib/intel64/gcc4.8/libtbb_debug.so.12(+0x44557) [0x7fd1cec9e557]
25      0x7fd1cec9f665 /home/sankhesh/Projects/ospray/install/lib/intel64/gcc4.8/libtbb_debug.so.12(+0x45665) [0x7fd1cec9f665]
24      0x7fd1ceca0fa2 /home/sankhesh/Projects/ospray/install/lib/intel64/gcc4.8/libtbb_debug.so.12(+0x46fa2) [0x7fd1ceca0fa2]
23      0x7fd1b5fe1f54 /home/sankhesh/Projects/ospray/install/lib/libembree3.so.3(+0xdbf54) [0x7fd1b5fe1f54]
22      0x7fd1cec9ee4d tbb::detail::r1::execute_and_wait(tbb::detail::d1::task&, tbb::detail::d1::task_group_context&, tbb::detail::d1::wait_context&, tbb::detail::d1::task_group_context&) + 85
21      0x7fd1cec9e557 /home/sankhesh/Projects/ospray/install/lib/intel64/gcc4.8/libtbb_debug.so.12(+0x44557) [0x7fd1cec9e557]
20      0x7fd1cec9f665 /home/sankhesh/Projects/ospray/install/lib/intel64/gcc4.8/libtbb_debug.so.12(+0x45665) [0x7fd1cec9f665]
19      0x7fd1ceca0fa2 /home/sankhesh/Projects/ospray/install/lib/intel64/gcc4.8/libtbb_debug.so.12(+0x46fa2) [0x7fd1ceca0fa2]
18      0x7fd1b5fe8ed8 /home/sankhesh/Projects/ospray/install/lib/libembree3.so.3(+0xe2ed8) [0x7fd1b5fe8ed8]
17      0x7fd1b5fe789a /home/sankhesh/Projects/ospray/install/lib/libembree3.so.3(+0xe189a) [0x7fd1b5fe789a]
16      0x7fd1b5fa2e8a /home/sankhesh/Projects/ospray/install/lib/libembree3.so.3(+0x9ce8a) [0x7fd1b5fa2e8a]
15      0x7fd1cec9ee4d tbb::detail::r1::execute_and_wait(tbb::detail::d1::task&, tbb::detail::d1::task_group_context&, tbb::detail::d1::wait_context&, tbb::detail::d1::task_group_context&) + 85
14      0x7fd1cec9e557 /home/sankhesh/Projects/ospray/install/lib/intel64/gcc4.8/libtbb_debug.so.12(+0x44557) [0x7fd1cec9e557]
13      0x7fd1cec9f665 /home/sankhesh/Projects/ospray/install/lib/intel64/gcc4.8/libtbb_debug.so.12(+0x45665) [0x7fd1cec9f665]
12      0x7fd1ceca0fa2 /home/sankhesh/Projects/ospray/install/lib/intel64/gcc4.8/libtbb_debug.so.12(+0x46fa2) [0x7fd1ceca0fa2]
11      0x7fd1b5fa1872 /home/sankhesh/Projects/ospray/install/lib/libembree3.so.3(+0x9b872) [0x7fd1b5fa1872]
10      0x7fd1b6218c56 /home/sankhesh/Projects/ospray/install/lib/libembree3.so.3(+0x312c56) [0x7fd1b6218c56]
9       0x7fd1b6b01569 /home/sankhesh/Projects/ospray/install/lib/libembree3.so.3(+0xbfb569) [0x7fd1b6b01569]
8       0x7fd1b70baef0 /home/sankhesh/Projects/ospray/install/lib/libembree3.so.3(+0x11b4ef0) [0x7fd1b70baef0]
7       0x7fd1b70bad46 /home/sankhesh/Projects/ospray/install/lib/libembree3.so.3(+0x11b4d46) [0x7fd1b70bad46]
6       0x7fd1b70b9460 /home/sankhesh/Projects/ospray/install/lib/libembree3.so.3(+0x11b3460) [0x7fd1b70b9460]
5       0x7fd1b70b9460 /home/sankhesh/Projects/ospray/install/lib/libembree3.so.3(+0x11b3460) [0x7fd1b70b9460]
4       0x7fd1b70b9460 /home/sankhesh/Projects/ospray/install/lib/libembree3.so.3(+0x11b3460) [0x7fd1b70b9460]
3       0x7fd1b70b9460 /home/sankhesh/Projects/ospray/install/lib/libembree3.so.3(+0x11b3460) [0x7fd1b70b9460]
2       0x7fd1b70b8388 /home/sankhesh/Projects/ospray/install/lib/libembree3.so.3(+0x11b2388) [0x7fd1b70b8388]
1       0x7fd1b6a77818 /home/sankhesh/Projects/ospray/install/lib/libembree3.so.3(+0xb71818) [0x7fd1b6a77818]
0       0x7fd1d6a7ada0 /usr/lib/libc.so.6(+0x3cda0) [0x7fd1d6a7ada0]
(   0.257s) [main thread     ]                       :0     FATL| Signal: SIGFPE
johguenther commented 2 years ago

I thought about this some more. My wrong assumption was that FPEs are limited to the C++ code, but of course those are HW runtime checks, which will also trigger when executing ISPC code. This is an issue: our rendering code is optimized for performance (and robustness when it matters, i.e., for intersection, but typically not for material shading code); we even recommend to set denormals-are-zero and flush-to-zero; in many places division-by-zero is fine, because the algorithms correctly deal with inf. Thus, I tend to close with "won't fix". What is the context, why does VTK enable FPEs (and, BTW, inconsistently between Windows (underflows trigger) and Linux(underflows ignored)?

johguenther commented 2 years ago

Oh, it's even close to impossible to avoid FPEs for ISPC code: inactive pixels or sections of diverging code correspond to (software) masked SIMD lanes, i.e., those results are never used but intermediate results may be computed with garbage values that can still trigger FPEs (at least for AVX2 where are no mask registers / predicates that AVX512 has).

sankhesh commented 2 years ago

Totally fine by me. VTK enables FPE checks for all rendering tests to catch idiosyncracies. I have a change that disables this for OSPRay tests here - https://gitlab.kitware.com/vtk/vtk/-/merge_requests/8483