OpenGL

The long-standing cross-platform graphics API. Since OpenGL 4.3 (and OpenGL ES 3.1) it has compute shaders in GLSL that read and write buffers and images — the simplest way to add GPGPU to an existing OpenGL app without bringing in a separate compute API. Note that WebGL does not expose compute shaders; use WebGPU there instead.

KhronosC/C++ · GLSLcross-vendorcompute shaderswidely supported

Official docs ↗ ← All libraries

Install

# Install GPU drivers plus a loader + windowing/context library
# Linux (Ubuntu):
sudo apt-get install -y libglew-dev libglfw3-dev
# requires an OpenGL 4.3+ context at runtime

Hello, GPU

double.comp.glsl — an OpenGL 4.3 compute shader

// double.comp.glsl — GLSL compute shader
#version 430
layout(local_size_x = 64) in;
layout(std430, binding = 0) buffer Data { float v[]; };

void main() {
    uint i = gl_GlobalInvocationID.x;
    v[i] = v[i] * 2.0;
}

/* Host (C/C++, abbreviated — inside a current GL 4.3 context):
   GLuint s = glCreateShader(GL_COMPUTE_SHADER);
   glShaderSource(s, 1, &src, NULL); glCompileShader(s);
   GLuint p = glCreateProgram(); glAttachShader(p, s); glLinkProgram(p);

   GLuint ssbo; glGenBuffers(1, &ssbo);
   glBindBuffer(GL_SHADER_STORAGE_BUFFER, ssbo);
   glBufferData(GL_SHADER_STORAGE_BUFFER, n*4, data, GL_DYNAMIC_COPY);
   glBindBufferBase(GL_SHADER_STORAGE_BUFFER, 0, ssbo);

   glUseProgram(p);
   glDispatchCompute(n / 64, 1, 1);
   glMemoryBarrier(GL_SHADER_STORAGE_BARRIER_BIT);
   glGetBufferSubData(GL_SHADER_STORAGE_BUFFER, 0, n*4, data); // doubled */

Run it:

# compile/link the host program against -lGLEW -lglfw -lGL, then run it

Learn more