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.

Installation

Spork runs on Apple Silicon (or any Mac with Metal). Install it from PyPI:

pip install spork-metal

Or with uv:

uv add spork-metal

The package is published as spork-metal on PyPI; the import name is spork:

import spork as sk

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.1.tar.gz (17.0 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.1-py3-none-any.whl (19.8 kB view details)

Uploaded Python 3

File details

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

File metadata

  • Download URL: spork_metal-0.1.1.tar.gz
  • Upload date:
  • Size: 17.0 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.13.12

File hashes

Hashes for spork_metal-0.1.1.tar.gz
Algorithm Hash digest
SHA256 48ce8d5dd15f2225d716dcdac86800a647e7dbd667206d908293b691ad4190b5
MD5 33aeb4ad2b917452cd919897862fa4c2
BLAKE2b-256 c3c0a070fc9470731e92de387739ef05ae41f9cedc3abce274e9f79ba414dd52

See more details on using hashes here.

Provenance

The following attestation bundles were made for spork_metal-0.1.1.tar.gz:

Publisher: publish.yml on save-buffer/spork

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

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

File metadata

  • Download URL: spork_metal-0.1.1-py3-none-any.whl
  • Upload date:
  • Size: 19.8 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.13.12

File hashes

Hashes for spork_metal-0.1.1-py3-none-any.whl
Algorithm Hash digest
SHA256 992f7fd911e8aad81fdaf87eb35ec73c3425a54e6d67b8dd5f66f79a5f5744c3
MD5 1cb98cfcc2b7a158d97e4b05a6481994
BLAKE2b-256 b0ea7b77cd024eb4e4a5e38b49362b6ec1fd87441d6dc0f3490e6a5a9bcb2c30

See more details on using hashes here.

Provenance

The following attestation bundles were made for spork_metal-0.1.1-py3-none-any.whl:

Publisher: publish.yml on save-buffer/spork

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

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