ComputePrefixSum
new ComputePrefixSum(dataBuffer : StorageBufferNode, options : Object)GPU-accelerated parallel prefix sum (exclusive scan) for Three.js TSL compute shaders.
ComputePrefixSum implements the Blelloch scan algorithm for computing prefix sums entirely on the GPU. It's designed as a building block for more complex parallel algorithms like radix sort.
Features
- Fully GPU-accelerated: All operations execute as compute shaders
- Hierarchical: Handles arrays larger than a single workgroup via recursive block sums
- Work-efficient: O(n) work complexity using Blelloch algorithm
- WebGPU only: Requires workgroup shared memory (not available in WebGL)
Algorithm
The Blelloch scan operates in two phases:
- Up-sweep (reduce): Build a tree of partial sums from leaves to root
- Down-sweep: Propagate prefix sums from root back to leaves
For arrays larger than workgroup capacity, the algorithm:
- Computes local prefix sums per workgroup
- Extracts block sums (total per workgroup)
- Recursively computes prefix sum on block sums
- Adds block prefix sums back to each element
Usage
Constructor Parameters
dataBufferStorageBufferNodeoptionsoptionalObjectDefault is
{}.workgroupSizeoptionalnumberThe workgroup size for compute shaders. Each workgroup processes 2 * workgroupSize elements. Must be a power of 2.
Default is128.
Example
import { instancedArray } from 'three/tsl';
import { ComputePrefixSum } from '@three-blocks/core';
// Create a buffer of uint values
const data = instancedArray(new Uint32Array([3, 1, 4, 1, 5, 9, 2, 6]), 'uint');
// Create prefix sum instance
const prefixSum = new ComputePrefixSum(data);
// Compute prefix sum
prefixSum.compute(renderer);
// Result: [0, 3, 4, 8, 9, 14, 23, 25]
Properties
# .dataBuffer : StorageBufferNode
The storage buffer to compute prefix sum on (modified in place).
# .count : number
Number of elements in the buffer.
# .workgroupSize : number
Number of threads per workgroup.
# .itemsPerWorkgroup : number
Number of elements processed per workgroup (2 per thread).
# .workgroupCount : number
Number of workgroups needed.
# .localStorage : WorkgroupArrayNode
Workgroup shared memory for local scan.
# .blockSumsBuffer : StorageBufferNode
Buffer storing each workgroup's total sum.
# .blockPrefixSum : ComputePrefixSum
Recursive prefix sum for block sums.
# .localScanFn : ComputeNode
Local scan compute function.
# .addBlockSumsFn : ComputeNode
Add block sums compute function.
# .initialized : boolean
Whether initialized.
Methods
init#
init(renderer : WebGPURenderer)Initializes the prefix sum for the given renderer.
Parameters
rendererWebGPURenderercompute#
compute(renderer : WebGPURenderer)Computes the prefix sum in a single call.
Parameters
rendererWebGPURendererdispose#
dispose()Disposes of GPU resources held by this instance.