[Nouveau] Towards OpenCL/Cuda Support, Part 3
What Happened in the Past Year?

Wow! I hadn’t realise that the last update was already almost a year ago… One day I’ll manage to do frequent and regular updates.
Without further due, let’s delve into the the news!



It was my first time attending FOSDEM, and I had a great time! There are a quite a few things going on, and I sadly did not have enough time to check out everything I would have liked to. I’ll try to do better next year!
A bit more on topic: Hans de Goede and I gave a talk (slides and video available on the talk’s page) about our respective works on achieving OpenCL support for Nouveau. That talk was mostly an overview over our approaches as well as a status update.

XDC 2016

After missing XDC 2015 due to just starting as a PhD student in Lund, Sweden, I was really eager to attend XDC 2016 in Finland and meet again with the Nouveau developers and the other members of the Linux graphics community. It was a blast! We met some new NVIDIA devs and were even invited to their office in Helsinki! (They have an old subway display panel that they reversed engineered, in their office, and which was welcoming us (video).)
I presented a small update on my work as part as the traditional "Nouveau: Status Update" (video and slides available here). And I even had a small demo to show! (Well, only because Martin suggested, rightfully so, that I should have one.) It was nothing too fancy but made use of some of the new features I had been working on: if-statements, loops and atomics.


New stuff

So, now that we have talked about the conferences, let’s have a look at what has been accomplished in this past year since the last blog post:

  • The re-write, announced in the previous blog post, was finished (though a new one will be needed: more on that further down);
  • Support added for Fermi, Kepler and Maxwell;
  • A (non-final) out-of-SSA pass was implemented;
  • Thanks to the out-of-SSA pass, it was possible to add if-statements and loops support (loops with 2 or more Basic Blocks trigger a bug in the Register Allocation pass of Nouveau, though);
  • Most of the atomic operations (missing atomic flag operations from OpenCL 2.0, among others);
  • A few OpenCL intrinsics (s_mad 24+ u_mad24)
  • Better support in Clover: clCreateProgramWithSource(), clCreateProgramWithBinary() and clCreateProgramWithIL() (new from OpenCL 2.1) got support for SPIR-V, making it possible to properly pass the SPIR-V binary to Nouveau via Clover.

WIP and More

Currently going on:

  • Cleaning up the patches for Clover in order to submit them for a Request for Comments (RFC) this week. (I was hoping to submit the RFC this week-end, but that did not happen. :-/)
  • Cleaning up the patches for a SPIR-V linker.
  • Rewrite memory management code (get local memory working, finish vector, arrays, matrices, structures support)

Once the previous steps are done:

  • Resolve RA issue for loops;
  • Have a look at events, async_work_group_copy & co, as well as barriers (most likely);
  • Start submitting some bits and pieces of the skeleton of this translation pass, like the parsing and memory management parts, for RFC.

For the future:

  • I have already started working on images read/write, but it still needs some fixes on the actual read and write operations, as well as some support in Nouveau for textures whose type/format is only known at runtime. Samuel will have a look at that whenever he has some time to spare.
  • Looking into ARB_gl_spirv.
Written by pmoreau on Dec 30 2016, 12:16 AM.

Event Timeline