Public
Edited
Apr 9, 2023
Insert cell
Insert cell
function ProcessQueue(primitiveCount) {
const primitiveSize = 64
const MaxSharedMemory = 1024 * 32
const WorkgroupThreadCount = 1024
const SubgroupThreadCount = 32
const SubgroupCount = WorkgroupThreadCount / SubgroupThreadCount
const TreeChildren = 64

// Goal: 1 primitive per thread
let ret = {}
ret.itemsDequeued = WorkgroupThreadCount / primitiveCount
ret.cellsPerThread = Math.ceil(ret.itemsDequeued / primitiveCount)
ret.totalSharedMem = ret.itemsDequeued * primitiveSize

ret.workPerThread = ret.cellsPerThread * primitiveCount / WorkgroupThreadCount
return ret
}
Insert cell
viewof range = Inputs.range([1, 64*1024], {label: "# of primitives", step: 1})
Insert cell
result = Array(range).fill(0).map((v, i) => {
const primitiveCount = i;
return Object.assign({primitiveCount}, ProcessQueue(primitiveCount))
})
Insert cell
Plot.plot({
marginLeft:40,
marks: [
Plot.gridY({
strokeDasharray: "0.75,2", // dashed
strokeOpacity: 1 // opaque
}),
Plot.axisY({
tickSize: 0, // don’t draw ticks
dx: 38, // offset right
dy: -6, // offset up
lineAnchor: "bottom", // draw labels above grid lines
tickFormat: (d, i, _) => (i === _.length - 1 ? `${d}` : d)
}),

Plot.line(result, { x: "primitiveCount", y: "itemsDequeued", stroke: "green" }),
Plot.line(result, { x: "primitiveCount", y: "workPerThread", stroke: "orange" }),
Plot.line(result, { x: "primitiveCount", y: "cellsPerThread", stroke: "purple" }),
]
})
Insert cell

Purpose-built for displays of data

Observable is your go-to platform for exploring data and creating expressive data visualizations. Use reactive JavaScript notebooks for prototyping and a collaborative canvas for visual data exploration and dashboard creation.
Learn more