webgpu之wgsl内存对齐记录
·
这里直接搬运官网代码进行学习记录
struct S {
x: f32
}
struct Invalid {
a: S,
b: f32 // invalid: offset between a and b is 4 bytes, but must be at least 16
}
@group(0) @binding(0) var<uniform> invalid: Invalid;
struct Valid {
a: S,
@align(16) b: f32 // valid: offset between a and b is 16 bytes
}
@group(0) @binding(1) var<uniform> valid: Valid;
这里表达的是规则之一,如果嵌套了结构体U,那么结构体U,要是16的倍数,
这个例子就是演示了S只有4,不够,需要align16
struct small_stride {
a: array<f32,8> // stride 4
}
// Invalid, stride must be a multiple of 16
@group(0) @binding(0) var<uniform> invalid: small_stride;
struct wrapped_f32 {
@size(16) elem: f32
}
struct big_stride {
a: array<wrapped_f32,8> // stride 16
}
@group(0) @binding(1) var<uniform> valid: big_stride; // Valid
下面这个例子,表达的是另外一个规则,数组必须满足他的stride是16的倍数
本来array<f32,8>的stride是4,4是查询StrideOf查询到的 RequiredAlignOf

重点是他用了另外一个结构体包一下,把f32包成了size是16的结构体
这样感觉好奇怪噢,f32非要撑大到16
原文如下
更多推荐
所有评论(0)