You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

WebGPU中能否使用数组的数组?如何创建对应缓冲区并在计算着色器中声明

WebGPU中数组的数组使用及缓冲区创建方案

是否支持数组的数组?

WebGPU的WGSL语言支持数组的数组(多维数组),但要注意内存布局规则:多维数组在内存中是连续平铺存储的,本质上和一维连续内存块的结构一致,只是在着色器中可以按多维逻辑访问。


一、JavaScript端创建匹配格式的输入/输出缓冲区

针对你给出的const arr = [new Float32Array([1, 3, 5]), new Float32Array([2, 4, 6]), ...]结构,需要先将所有子数组合并为连续的Float32Array(WebGPU缓冲区要求内存连续),再创建缓冲区:

// 1. 合并子数组为连续的Float32Array
const arr = [new Float32Array([1, 3, 5]), new Float32Array([2, 4, 6])];
const totalLength = arr.reduce((sum, subArr) => sum + subArr.length, 0);
const combinedArray = new Float32Array(totalLength);

let offset = 0;
for (const subArr of arr) {
  combinedArray.set(subArr, offset);
  offset += subArr.length;
}

// 2. 创建输入缓冲区(支持写入和存储访问)
const inputBuffer = device.createBuffer({
  size: combinedArray.byteLength,
  usage: GPUBufferUsage.STORAGE | GPUBufferUsage.COPY_DST,
  mappedAtCreation: true
});
new Float32Array(inputBuffer.getMappedRange()).set(combinedArray);
inputBuffer.unmap();

// 3. 创建格式完全一致的输出缓冲区(支持存储访问和读取结果)
const outputBuffer = device.createBuffer({
  size: combinedArray.byteLength,
  usage: GPUBufferUsage.STORAGE | GPUBufferUsage.COPY_SRC
});

二、WGSL中声明数组的数组

根据数据结构的固定/动态特性,有两种声明方式:

情况1:固定长度的多维数组

如果子数组数量和每个子数组的长度都是确定值,可以直接声明多维数组:

// 示例:2个长度为3的float数组
struct BufferData {
  data: array<array<f32, 3>, 2>;
};

@group(0) @binding(0) var<storage, read> input: BufferData;
@group(0) @binding(1) var<storage, write> output: BufferData;

情况2:动态长度的多维数组

如果子数组数量是运行时确定的,用一维数组模拟多维访问更灵活:

// 声明动态长度的float数组
@group(0) @binding(0) var<storage, read> input: array<f32>;
@group(0) @binding(1) var<storage, write> output: array<f32>;

// 计算着色器中按多维逻辑访问
@compute @workgroup_size(64)
fn main(@builtin(global_invocation_id) global_id: vec3<u32>) {
  const index = global_id.x;
  if (index >= arrayLength(&input)) return;

  // 假设每个子数组长度固定为3,访问第i个子数组的第j个元素:input[i*3 + j]
  const subArrIdx = index / 3u;
  const elemIdx = index % 3u;
  
  // 示例:将输入数据复制到输出
  output[index] = input[index];
}

关键注意事项

  • 内存对齐:WGSL会自动按类型对齐(float为4字节,无需额外处理);若使用自定义结构体数组,需遵循WGSL的对齐规则。
  • 缓冲区Usage:输入缓冲区需包含STORAGE | COPY_DST,输出缓冲区需包含STORAGE | COPY_SRC;若需将输出缓冲区映射回JavaScript,需额外添加MAP_READ。

内容的提问来源于stack exchange,提问作者Dakar

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.05 20:56:15