这里直接搬运官网代码进行学习记录

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
原文如下
在这里插入图片描述

Logo

腾讯云面向开发者汇聚海量精品云计算使用和开发经验,营造开放的云计算技术生态圈。

更多推荐