Versions Compared

Key

  • This line was added.
  • This line was removed.
  • Formatting was changed.
Note

This page is a work in progress. OIDN, as of right now, IS NOT FUNCTIONAL.is ~7.5x slower than emulated

Project link: https://github.com/OpenImageDenoise/oidn

...

OpenImageDenoise is a dependency of Blender, one that is especially useful on non-workstation machines, as it masks a lot of the raytracing noise that comes with doing fewer render passes, as a lower-powered device would do.

Status

Very broken Working, but ~7.5x slower - ARM64 support is having to be added from scratch, and the route taken for x64 is not compatible.

...

There is a branch where I started this work (below, under “Compiling”), however I am struggling to get results from it. Currently the denoising is not working, however this is complicated by the fact that there are no tests, as it just assumes that the convolution implementations “just work”, so you just have to run the program, and see what it gives you as part of the outputin C++, got it working as a reference implementation, then reproduced the same result via ISPC. This is functional, but needs work on speeding it up.

Compiling

To compile the current ISPC in-progress branch, get it from here: https://github.com/anthony-linaro/oidn/tree/arm-ispc

...

Lower-res (useful for the current old CPP-based solution): https://drive.google.com/file/d/1AKvplud19LKmoOj0culkAj7IMir2OcC4/view?usp=sharing

...

Code Block
oidnDenoise.exe -hdr .\bmw3bmw.pfm -o .\bmwFiltered.pfm

And observe the spectacular failure that is the current attempt result by opening bmwFiltered.pfm in ImageMagick.

Notes

  • The current convolution filter attempt is implemented There is a reference implementation in C++ a few commits back (to ensure correctness), and is in the file devices/cpu/ispc/ispc_conv.cpp - the ISPC bit can come came later, once we have something workingand is now the implementation of choice

  • The input and output tensor formats are in the format “Chw8c”“CHW”, more details on which can be found here under “blocked layout”: https://oneapi-src.github.io/oneDNN/dev_guide_understanding_memory_formats.html#blocked-layout

  • OIDN uses a u-net architecture - it already does the pooling for us in Chw8c, which is why it has been used, as opposed to just using straight “chw”CHW tensors has been implemented alongside this, but upsampling, etc was already in

  • You may note that “n” has been omitted in all these tensor formats compared to normal - it is implied that n is never anything but 0 - the OIDN code itself uses the naming convention with no “n”

  • The weights are in OIHW format

...