概览WebGPU 为浏览器带来现代图形与通用计算能力。实战中需要重视设备能力检测(`adapter` 与 `device.limits`)、资源布局(Buffer/Texture)、着色器管线(Render/Compute)以及可重复的性能验证流程。能力检测与设备初始化async function init() { if (!('gpu' in navigator)) throw new Error('WebGPU 未支持') const adapter = await navigator.gpu.requestAdapter() if (!adapter) throw new Error('未获取到适配器') const device = await adapter.requestDevice() const limits = device.limits console.table({ maxBindGroups: limits.maxBindGroups, maxComputeWorkgroupSizeX: limits.maxComputeWorkgroupSizeX, maxComputeWorkgroupSizeY: limits.maxComputeWorkgroupSizeY, maxComputeWorkgroupSizeZ: limits.maxComputeWorkgroupSizeZ, }) return { device } } 计算管线示例(WGSL)@group(0) @binding(0) var<storage, read> input: array<f32> @group(0) @binding(1) var<storage, read_write> output: array<f32> @compute @workgroup_size(64) fn main(@builtin(global_invocation_id) gid: vec3u) { let i = gid.x; if (i < arrayLength(&input)) { output[i] = input[i] * 2.0; } } 提交与计时验证async function runCompute(device, inputData) { const size = inputData.length * 4 const input = device.createBuffer({ size, usage: GPUBufferUsage.STORAGE | GPUBufferUsage.COPY_DST }) const output = device.createBuffer({ size, usage: GPUBufferUsage.STORAGE | GPUBufferUsage.COPY_SRC }) device.queue.writeBuffer(input, 0, new Float32Array(inputData)) const module = device.createShaderModule({ code: wgslSource }) const pipeline = device.createComputePipeline({ compute: { module, entryPoint: 'main' } }) const bindGroup = device.createBindGroup({ layout: pipeline.getBindGroupLayout(0), entries: [ { binding: 0, resource: { buffer: input } }, { binding: 1, resource: { buffer: output } }, ], }) const encoder = device.createCommandEncoder() const pass = encoder.beginComputePass() pass.setPipeline(pipeline) pass.setBindGroup(0, bindGroup) const workgroups = Math.ceil(inputData.length / 64) pass.dispatchWorkgroups(workgroups) pass.end() const t0 = performance.now() device.queue.submit([encoder.finish()]) await device.queue.onSubmittedWorkDone() const t1 = performance.now() const readback = device.createBuffer({ size, usage: GPUBufferUsage.MAP_READ | GPUBufferUsage.COPY_DST }) const copyEncoder = device.createCommandEncoder() copyEncoder.copyBufferToBuffer(output, 0, readback, 0, size) device.queue.submit([copyEncoder.finish()]) await readback.mapAsync(GPUMapMode.READ) const result = new Float32Array(readback.getMappedRange()).slice() readback.unmap() return { result, elapsedMs: t1 - t0 } } 性能与正确性要点以 `device.limits` 校验工作组与资源规模,避免越界与退化。使用 `performance.now()` 与帧内统计结合,构建可重复的测量。对输出进行断言或采样验证,确保计算正确性与稳定性。参考资料WebGPU Spec: https://www.w3.org/TR/webgpu/MDN WebGPU 指南: https://developer.mozilla.org/docs/Web/API/WebGPU_API

点赞(0) 打赏

评论列表 共有 0 条评论

暂无评论
立即
投稿

微信公众账号

微信扫一扫加关注

发表
评论
返回
顶部
1.553953s