Skip to main content

A tracing Python DSL for writing Metal compute kernels for Apple GPUs.

Project description

Spork: A Tracing DSL for Apple GPUs

Spork is a DSL for writing kernels for Apple GPUs. You can think of it as a Python wrapper on top of Metal, Apple's GPU language. This makes development more convenient, since it makes the kernels live in the same source language as most ML code, and makes it easy to verify correctness against NumPy.

Unlike Triton, Spork is a tracing DSL rather than a parsing-based DSL. This means that a Spork program is fundamentally a Python program that creates a Metal program. Spork can use any Python libraries to aid in metaprogramming.

Example: Matrix Addition

One of the most basic kernels is a matrix-addition kernel. In Numpy, you could write

shape = (1024, 1024)
A = np.random.randn(*shape).astype(np.float32)
B = np.random.randn(*shape).astype(np.float32)
out = A + B

A Metal kernel to perform this operation would look like this:

#include <metal_stdlib>
using namespace metal;

kernel void matrix_add(
    device float *out [[buffer(0)]],
    device const float *A [[buffer(1)]],
    device const float *B [[buffer(2)]],
    uint index [[thread_position_in_grid]])
{
    out[index] = A[index] + B[index];
}

Notice that it exists in a separate source file and requires special code to compile, link to, and invoke. An equivalent Spork kernel looks like this:

@sk.jit
def matrix_add(
    out   : sk.DevicePointer[sk.dt.float32],
    A     : sk.DevicePointer[sk.dt.float32],
    B     : sk.DevicePointer[sk.dt.float32],
    index : sk.Uint[sk.ThreadPositionInGrid],
):
    out[index] = A[index] + B[index]

Notice that we have a direct correspondance here between the Spork kernel and the Metal kernel. We declare the types of our inputs, and we can take the attribute parameters that we take in Metal.

Then to actually invoke and run kernel, we simply call it from Python with Numpy arrays, and like magic it runs your kernel!

matrix_add[
    (int(np.prod(shape)) // 128, 1, 1),
    (128, 1, 1),
](
    C,
    A,
    B,
)

Notice that in the brackets, we provide two parameters. The first is the Grid size, and the second is the Warpgroup size. In the parentheses, we supply the Numpy tensors we wish to use. Notice that here we're taking a pointer to C, which is allocated via Numpy but written to from the Spork kernel.

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

spork_metal-0.1.0.tar.gz (16.8 kB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

spork_metal-0.1.0-py3-none-any.whl (19.7 kB view details)

Uploaded Python 3

File details

Details for the file spork_metal-0.1.0.tar.gz.

File metadata

  • Download URL: spork_metal-0.1.0.tar.gz
  • Upload date:
  • Size: 16.8 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: uv/0.8.0

File hashes

Hashes for spork_metal-0.1.0.tar.gz
Algorithm Hash digest
SHA256 857f5cdf324e9cd46356a23e740ee2b7c2459846eda1c6ab9be3ed28db1c5004
MD5 56399f6275c57524ddf1f7870dbb5c7f
BLAKE2b-256 a6951fffca863e7dc5dd237fa500db9ef5ded8e038cba9a6085451d052383e2c

See more details on using hashes here.

File details

Details for the file spork_metal-0.1.0-py3-none-any.whl.

File metadata

File hashes

Hashes for spork_metal-0.1.0-py3-none-any.whl
Algorithm Hash digest
SHA256 9f676782efc9ddb611f409875f823fc2323fa1d64c81d86d64f48d3a17de0c70
MD5 adb535f3f7e4b3e2c36efa9d8a437653
BLAKE2b-256 a1d0dd26ec1db39f349c22ad783135e7cbafc42e0fc267086ab2bb31a3fa651a

See more details on using hashes here.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page