Codync
A free, open-source 1:1 alternative to Grok Bot and Muse. Message Claude Code, Codex, Cursor and 40+ coding agents as persistent bots from your iPhone, Mac or Linux desktop. Group chats, threads, appr
WebGPU Compute Primitives in JavaScript
Translation pending
Developer toolsGitHub @gridwise-webgpuOnlineOwner unconfirmed
Have you tried it? One tap is enough. No sign-in needed.
Repository information has not been collected yet.
No updates detected yet. GitHub releases will appear here.
Gridwise: WebGPU Compute Primitives in JavaScript
Translation pending
Taken from the repository README
Loading the full README.
Read the full README ↗High-performance WebGPU parallel compute primitives in JavaScript.
Gridwise provides high-throughput GPU compute primitives — scan (prefix sum), reduce, and radix sort — built on WebGPU. It runs directly in modern browsers and in Node.js (via webgpu / Dawn) with zero native build dependencies.
u32, i32, and f32 data types with configurable binary operators (BinOpAdd, BinOpMin, BinOpMax, BinOpMultiply).index.d.ts).npm install gridwise
DLDFScan)import { DLDFScan, BinOpAdd } from "gridwise";
// 1. Initialize WebGPU
const adapter = await navigator.gpu.requestAdapter();
const device = await adapter.requestDevice({
requiredFeatures: adapter.features.has("subgroups") ? ["subgroups"] : [],
requiredLimits: { maxComputeWorkgroupStorageSize: 32768 }, // needed by sort only
});
// 2. Create input and output GPU buffers
const count = 1000000;
const inputData = new Uint32Array(count).fill(1);
const inputBuffer = device.createBuffer({
size: inputData.byteLength,
usage: GPUBufferUsage.STORAGE | GPUBufferUsage.COPY_DST,
mappedAtCreation: true,
});
new Uint32Array(inputBuffer.getMappedRange()).set(inputData);
inputBuffer.unmap();
const outputBuffer = device.createBuffer({
size: inputData.byteLength,
usage: GPUBufferUsage.STORAGE | GPUBufferUsage.COPY_SRC,
});
// 3. Instantiate and run DLDFScan
const scan = new DLDFScan({
device,
type: "exclusive",
datatype: "u32",
binop: new BinOpAdd({ datatype: "u32" }),
});
scan.registerBuffer({ label: "inputBuffer", buffer: inputBuffer });
scan.registerBuffer({ label: "outputBuffer", buffer: outputBuffer });
// The input length comes from the registered input buffer.
await scan.execute();
OneSweepSort)import { OneSweepSort } from "gridwise";
const sort = new OneSweepSort({
device,
type: "keysonly",
datatype: "u32",
direction: "ascending",
});
// keysBuffer holds the keys (STORAGE usage); keysTempBuffer is the same size.
sort.registerBuffer({ label: "keysInOut", buffer: keysBuffer });
sort.registerBuffer({ label: "keysTemp", buffer: keysTempBuffer });
await sort.execute();
// Radix sort ping-pongs between the two buffers, so both may be overwritten,
// and the sorted keys are in whichever the last pass wrote. The sort reports
// which (also as sort.outputKeysBufferName, "keysInOut" or "keysTemp").
// Or construct it with copyOutputToTemp: true to always find them in keysTemp.
const sortedBuffer = sort.outputIsInTemp ? keysTempBuffer : keysBuffer;
Licensed under the Apache License, Version 2.0.