Heyo, I’m Neil Henning and this is the log of my adventures with gaia to date!
In Burst 1.7 my main contributions were:
- Added an object cache to Burst, making compilation times 3.5x faster.
- Made Direct Call Burst’ed methods 33x faster to process during domain reload.
- Made Shared Statics usage 13.3x faster when entering playmode.
- Improved the compile time of Unity NetCode by 39x through improvements to the Burst compiler.
In Burst 1.6 my main contributions were:
- Improved the compile time of Burst by 4x.
- Made Burst load 20x faster during startup.
- Made code changes in the editor 2x faster.
In Burst 1.5 my main contributions were:
- Reduced the executable size of Burst’ed code by 43%.
- Improved the compile time of Burst by 45%.
Unlikelyintrinsics to Burst to let users hint to the compiler about optimizations opportunities.
- Added an opt-for-size mode to Burst to reduce executable size by a further 11%.
I open sourced a single header benchmarking library for C/C++. Check out the library on my GitHub - https://github.com/sheredom/ubench.h.
I open sourced a single header hashmap library for C/C++. Check out the library on my GitHub - https://github.com/sheredom/hashmap.h.
In Burst 1.4 my main contributions were:
- Added support for
FMAintrinsics to Burst.
- Improved Burst compile time by 30% by using a sizable internal Unity production as a test bed.
- Added support for
AssumeRangeacross Unity Collections code to enable significant optimization opportunities in Burst.
- Changed how we vectorize to significantly improve vectorization (in collaboration with our partnership with Arm).
- Added support for cross platform native hardware exception handling in Burst’ed code. This meant that the three desktop platforms (Windows, macOS, Linux) could, in the editor, catch exceptions caused by Burst code (dereferencing
nullor things of that nature). This was a hugely complex feature.
2020 - Published In parameters in Burst blog post on Unity’s blog⌗
Our users were getting conflicting advice on whether
in parameters were safe to use, so I wrote a hugely popular blog post summarizing what happens with
in parameters in Burst, and where you should think about using them.
2020 - Published Enhanced Aliasing with Burst blog post on Unity’s blog⌗
To explain how aliasing works and how to take advantage of the new aliasing support in Burst 1.3, I wrote a popular blog post explaining what aliasing is, how you can avoid it, and the new compiler intrinsics I added to let users ask the compiler ‘Hey do these things alias?'.
In Burst 1.3 my main contributions were:
- Added an advanced aliasing solution for Burst, supercharging Burst’ed code by enabling much better aliasing deductions, improving optimizations, and enabling vectorization in more cases.
- I also improved the startup performance of the Burst compiler by 3x.
- Spent a lot of time improving the performance of Unity Physics’ Burst’ed code.
- Added an
AssumeRangeattribute to let us provide assumptions on return values and parameters.
2020 - Released Vulkan 1.2 & SPIR-V 1.5⌗
When I was at AMD I was working furiously on Vulkan 1.2 features that’d make developers lives happier. I mostly worked on things related to bindless and subgroup support, and my hands are very much in the creation of these specifications - even though they came out 6 months after I left AMD! Super stoked that these are now in developers hands.
2019 - Joined Unity⌗
I joined Unity to work on the Burst compiler - an optimizing compiler that takes a subset of C# and uses LLVM to turn this into highly performant and vectorized code. The opportunity to make such a huge impact to develpers lives (Burst is changing the game for Unity users) was too appealing to turn down.
2019 - Released VK_KHR_uniform_buffer_standard_layout⌗
I was an author of the GLSL extension VK_KHR_uniform_buffer_standard_layout, which lets developers use the
std430 layout on uniform buffer objects (UBOs).
2019 - Released VK_EXT_subgroup_size_control⌗
I was an author of the GLSL extension VK_EXT_subgroup_size_control, which lets developers get access to the variable subgroup size support in AMD Navi GPUs and Intel GPUs.
2019 - Released VK_EXT_pipeline_creation_feedback⌗
I was an author of the GLSL extension VK_EXT_pipeline_creation_feedback, which lets developers get feedback from what actually took place during pipeline creation - to be used for effectively creating pipeline caches.
2019 - Released VK_EXT_buffer_device_address⌗
I was an author of the GLSL extension VK_EXT_buffer_device_address, which lets developers use explicit 64-bit pointers in their shaders.
2019 - Released GL_EXT_shader_explicit_arithmetic_types⌗
I was an author of the GLSL extension GL_EXT_shader_explicit_arithmetic_types, which lets developers use a ton of new types in GLSL, using much saner explicit names too!
2018 - Released SPV_KHR_no_integer_wrap_decoration⌗
I was an author of the SPIR-V extension SPV_KHR_no_integer_wrap_decoration, which lets developers add hints that integer operations do not wrap (which can be more performant on certain vendor hardware).
2018 - Released SPV_KHR_float_controls⌗
I was an author of the SPIR-V extension SPV_KHR_float_controls , which lets developers control the floating-point rounding and flushing behaviour of their shaders.
2018 - Released VK_KHR_shader_atomic_int64⌗
I was an author of the Vulkan extension VK_KHR_shader_atomic_int64, which lets developers use 64-bit integer in atomic operations in their shaders.
2018 - Released VK_EXT_inline_uniform_block⌗
I was an author of the Vulkan extension VK_EXT_inline_uniform_block, which lets developers put small constants within descriptor sets that gives them an additional method to load data onto AMD GPUs more efficiently.
2018 - Joined AMD⌗
I joined AMD to work in the Game Engineering division, bringing my skills in compilers, drivers, and optimisations.
My background with heterogeneous hardware, coupled with my experience with LLVM and a general love of making things as fast and maintainable as possible, make me an ideally placed to thrive at AMD.
2018 - Released SPV_EXT_descriptor_indexing⌗
I contributed to the SPIR-V extension SPV_EXT_descriptor_indexing, which lets developers make use of bindless buffers and images in the Vulkan API.
2018 - Published a Vulkan Subgroup Tutorial on khronos.org⌗
I published a Vulkan Subgroup Tutorial on khronos.org, covering how to make use of the subgroup functionality I added to Vulkan 1.1.
2018 - Released Vulkan 1.1 & SPIR-V 1.3⌗
As the primary author of Vulkan’s subgroup functionality I am proud to have spent 2 years of my life ensuring that Vulkan 1.1 is what developers need. The work I undertook included writing the GL_KHR_shader_subgroup GLSL extension, adding glslang support for GL_KHR_shader_subgroup and HLSL’s Shader Model 6.0 wave operations, adding the GroupNonUniform SPIR-V 1.3 opcodes, and also writing the conformance tests.
2017 - Open Sourced subprocess.h⌗
I open sourced a single header process spawning and interaction library for C/C++. Check out the library on my GitHub - https://github.com/sheredom/subprocess.h.
2017 - Speaker at Khronos Munich Chapter⌗
I gave a talk at the Khronos Munich Chapter titled ‘OpenCL to Vulkan: A Porting Guide'. I covered how to port from the OpenCL API to the Vulkan API, some common problems our customers have faced, and how to fix them. Slides
2017 - Released VK_KHR_image_format_list⌗
I contributed to the Vulkan extension VK_KHR_image_format_list, which lets developers list what image formats will be used with VK_IMAGE_CREATE_MUTABLE_FORMAT_BIT allowing implementations to use more optimal paths where possible.
2017 - Released VK_KHR_maintenance2⌗
I contributed to the Vulkan extension VK_KHR_maintenance2, which is a bumper pack of extensions on Vulkan 1.0 to enable a bunch of functionality developers had been requesting.
I was the project lead and main developer on a Google/Codeplay collaboration project clspv, which allows OpenCL C sources to be compiled to Vulkan SPIR-V. The codebase is being actively used by developers to port 1 million+ line codebases of OpenCL C to Vulkan with minimal source changes.
2017 - Released VK_KHR_variable_pointers⌗
I contributed to the Vulkan extension VK_KHR_variable_pointers, which allows for more expressive pointer operations to be used by SPIR-V in Vulkan 1.0.
2017 - Released VK_KHR_16bit_storage⌗
I contributed to the Vulkan extension VK_KHR_16bit_storage, which allows 16 bit buffers to be loaded and stored from, while performing operations in a higher bit-width type, in the SPIR-V used in Vulkan 1.0.
2017 - Released SPIR-V 1.2⌗
I contributed to SPIR-V version 1.2, primarily targeted at OpenCL.
2017 - Released SPV_KHR_variable_pointers⌗
I contributed to the SPIR-V extension SPV_KHR_variable_pointers, which enables more expressive pointer operations in SPIR-V.
2017 - Released SPV_KHR_16bit_storage⌗
I contributed to the SPIR-V extension SPV_KHR_16bit_storage, which enables 16 bit load/store operations in SPIR-V.
2017 - Released VK_KHR_maintenance1⌗
I contributed to the Vulkan extension VK_KHR_maintenance1, which is a bumper pack of extensions on Vulkan 1.0 to enable a bunch of functionality developers had been requesting.
2017 - Released VK_EXT_shader_subgroup_ballot⌗
I contributed to the Vulkan extension VK_EXT_shader_subgroup_ballot, which enables a limited form of subgroup ballot operations via a Vulkan 1.0 extension.
2017 - Released VK_EXT_shader_subgroup_vote⌗
I contributed to the Vulkan extension VK_EXT_shader_subgroup_vote, which enables a limited form of subgroup vote operations via a Vulkan 1.0 extension.
2016 - Released SPV_KHR_shader_ballot⌗
I contributed to the SPIR-V extension SPV_KHR_shader_ballot, which enables a limited form of subgroup ballot operations via a SPIR-V 1.0 extension.
2016 - Released SPIR-V 1.1⌗
I contributed to SPIR-V version 1.1, primarily targeted at OpenCL.
I gave a talk at GDC titled ‘An Introduction to SPIR-V’. I covered the basics of SPIR-V, how and why Vulkan uses it, how to hand-write SPIR-V shaders, and how to optimize and find bugs in SPIR-V. Slides
2016 - Released Vulkan 1.0⌗
Two years of my life was sunk into making Vulkan a good platform for compute workloads, and in 2016 it was finally released to the community.
2016 - Released SPIR-V 1.0⌗
Two years of my life was sunk into making SPIR-V great for Vulkan. My focus was to ensure that Vulkan and SPIR-V would make a good target for compute workloads, something that the community can now utelize.
2016 - Released GL_KHR_vulkan_glsl⌗
I was a named contributor to the GLSL variant for Vulkan - this specification modifies the GLSL shading language to enable the features of Vulkan, something I was very proud to have worked on!
I open sourced a single header unit testing framework for C/C++. Check out the library on my GitHub - https://github.com/sheredom/utest.h.
I open sourced a JSON parser/writer for C/C++. The library supports JSON, but also simplified JSON too. Check out the library on my GitHub - https://github.com/sheredom/json.h
I open sourced a utf8 string processing library, to provide c string.h like functions but specifically for processing utf8 strings. Check out the library on my GitHub - https://github.com/sheredom/utf8.h
2015 - Speaker at Khronos UK Chapter/EuroLLVM⌗
I gave a talk at the Khronos UK Chapter’s side event attached to the main EuroLLVM conference. My talk was on SPIR-V, the motivation and some of the required features, and how both OpenCL and Vulkan will use it. I got to announce a small part of the specification here, specialization constants! Slides + speaker notes.
To coincide with my new focus on Vulkan and SPIR-V, I got a promotion within the company. My years of experience with Khronos and open standards put me in a great position to contribute back to the specifications of both Vulkan and SPIR-V.
Since its inception, I’ve been involved in the working group at Khronos to help define the new generation, and open standard API. My focus has primarily been;
- Compute as a first-class citizen in the API (including non-GPU compute support).
- Binary shader format evangelist.
- Smoothing the interaction between the API and the binary shaders.
SPIR-V is a truly revolutionary addition to the graphics and compute eco-system - now we have a single representation that allows us to define the many shader and kernel types that GLSL and OpenCL Kernel Language support (and of course - much, much, more). My involvement in SPIR-V allowed me to bring my years of experience in writing drivers for OpenGL ES and OpenCL, coupled with my lengthy time of using LLVM, to the working group.
I always knew I was going to end up working remotely - specifically on the Isle of Skye. My better half is from there, and in 2013 when she got a job in the local high school, I requested the right to work remotely, and it was granted. Six months later (I gave the company a grace period to ease the transition) I had bought a house, and am now reaping the rewards a remote life can bring (just look at the view I get every day!).
I was a speaker at the International Workshop on OpenCL - giving a talk entitled ‘SPIR me the details: building custom language support on OpenCL’. The talk gave a run through of the SPIR 1.2 specification, and by using the example of targeting custom languages at GPUs explained the pro’s and con’s of using SPIR with OpenCL.
2014 - Shipped OpenCL 1.2 driver for customer⌗
Shipped a conformant OpenCL 1.2 driver in the mobile space for a client. Details of which are unfortunately under NDA.
2013 - Speaker at AMD Developer Summit⌗
I was a speaker at AMD’s Developer Summit for 2013 - presenting a talk on how to target custom languages at heterogeneous systems. The talk focused mostly on the (at the time) recently announced SPIR 1.2 specification, and how to target that from your own languages.
2013 - Shipped OpenCL 1.2 driver for customer⌗
Shipped a conformant OpenCL 1.2 driver in the mobile space for a client. Details of which are unfortunately under NDA.
2012 - Shipped OpenCL 1.1 driver for customer⌗
Shipped a conformant OpenCL 1.1 driver in the mobile space for a client. Details of which are unfortunately under NDA.
2011 - Speaker at Game/AI Conference⌗
After our experience shipping NASCAR The Game 2011, notably the awesome/insane process I went through to get the AI system ported to the SPU on the PlayStation®3, I gave a talk at the Game/AI Conference going through the techniques I used to take very obtuse and linear code and have it run in parallel across the SPUs.
After gaining the relevant experience in the company, in 2011 I was promoted to Technology Lead. This changed my responsibilities in the company - involving me in the decision making process, leading a team, lots of client interaction and contract negotiations too.
2011 - Fire-fighting on an Activision title⌗
I was flown to the US for onsite fire-fighting for a title. The work was entirely porting code to the SPUs on the PlayStation®3, and I achieved a 10% (~4ms drop in frame time) improvement in just two weeks of on-site development.
2011 - Shipped NASCAR The Game: 2011⌗
After working for 15 months on this title, we finally shipped in 2011. My work was mostly in optimizations to hit a playable framerate, I partially ported PhysX to the SPUs, I ported the AI system to the SPUs, ported the metal damage system that we created for Eutechnyx to the SPUs, and general CPU optimizations for the Xbox 360 and PlayStation®3.
After graduating from University, I joined Codeplay - mostly because I knew they had PlayStation®3’s and I loved the SPU ISA.
2009 - Graduated from University of Glasgow with a BSc (Hons.) in Software Engineering⌗
During my four years at the University of Glasgow, I studied a wide range of courses, all of my electives being anything to do with Operating Systems and low level programming.
In my fourth year, I won the best project prize for my implementation of Software Transactional Memory on Cell - basically my first taste of using a PlayStation®3, and first time using the SPUs!