Technical

All technical blog posts written by people of the Stream HPC team.

OpenGL “Compute Shaders” Before Compute Shaders – Heroic Times

The times before the advent of compute shaders, twenty years ago, were heroic. GPU came out of infancy into adolescence: the pace of innovation was breathtaking. A year without new GPU architecture was unthinkable. You could see new programming languages and APIs appearing one after another, bringing us closer and closer to “real-time photorealistic rendering”

OpenGL “Compute Shaders” Before Compute Shaders – Heroic Times Read More »

When to Blame the Compiler: An NVCC Case Study

In our line of work, performing low-level performance optimization, the compiler is less of a language abstraction and more of a tool to directly interact with. Compilers are complex machines. Correctly converting C++-like code to assembly instructions is a gigantic challenge, producing optimized instructions even more so. It is therefore no surprise that the compiler

When to Blame the Compiler: An NVCC Case Study Read More »

The LuaJIT NYI That Silently Poisoned an Unrelated Hot Loop

If you haven’t used Lua before, it’s the go-to embedded scripting language for games like Factorio and World of Warcraft, and for applications like Neovim and OpenResty. LuaJIT, its just-in-time compiler, is widely praised for its speed, so it’s easy to assume your code is already running as fast as possible. In reality, you can

The LuaJIT NYI That Silently Poisoned an Unrelated Hot Loop Read More »

Image Upscaling Using Convolutional Neural Networks in Vulkan

In the world of high-performance programming, true portable code has been a goal for a long time. Vulkan has been very successful at this, with Vulkan drivers being provided by every major GPU vendor and available for all common desktop and mobile operating systems. Platforms without first party support (e.g. Apple macOS/iOS) have compatibility layers

Image Upscaling Using Convolutional Neural Networks in Vulkan Read More »

Lazy Ranges in C++23 with Std::generator

Disclaimer: LLMs were used for proof-reading and grammar check. C++20 gave us coroutines. The machinery needed was included: co_yield, co_return, co_await but the standard library had no concrete coroutine types. You had to write your own promise type, your own iterator, your own bookkeeping. The complexity of this boilerplate was intimidating for most people. C++23

Lazy Ranges in C++23 with Std::generator Read More »