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.2.0.tar.gz (19.7 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.2.0-py3-none-any.whl (22.5 kB view details)

Uploaded Python 3

File details

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

File metadata

  • Download URL: spork_metal-0.2.0.tar.gz
  • Upload date:
  • Size: 19.7 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.2.0.tar.gz
Algorithm Hash digest
SHA256 b67cec9cd1a3cc3b8e6ef60927b5a1948eb6e5de524e38d0b3d1abb0b0e381f3
MD5 133dcb396eae82cb5dca358d0d5440ad
BLAKE2b-256 bb25556a6d7ab795874a9b7022313e9c4f390e310f12a2c5f225ac022de68f34

See more details on using hashes here.

Provenance

The following attestation bundles were made for spork_metal-0.2.0.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.2.0-py3-none-any.whl.

File metadata

  • Download URL: spork_metal-0.2.0-py3-none-any.whl
  • Upload date:
  • Size: 22.5 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.2.0-py3-none-any.whl
Algorithm Hash digest
SHA256 0910896c253a673fb334ff5cc02d560f08e86833ef0317533b273175b55b9111
MD5 f94bfc8fb1df159ec0803fc25d9608de
BLAKE2b-256 024cc970fc35c38c9da24d21241838ffc382261b4e269ab02c5827f9a4108734

See more details on using hashes here.

Provenance

The following attestation bundles were made for spork_metal-0.2.0-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