gpt4 book ai didi

ios - 这段代码如何快速找到 Struct 的内存对齐大小?为什么需要二元运算?

转载 作者:IT王子 更新时间:2023-10-29 05:35:11 30 4
gpt4 key购买 nike

我正在研究 Metal iOS Swift 示例,试图理解他们建议的三重缓冲实践。这显示在统一动画的演示中。

据我所知,对齐内存只是从一个特定的增量开始,该增量是设备真正喜欢的某个字节数的倍数。我的困惑是这行代码

// The 256 byte aligned size of our uniform structure
let alignedUniformsSize = (MemoryLayout<Uniforms>.size & ~0xFF) + 0x100

他们用它来查找 Uniforms 结构的大小和字节。我很困惑为什么这里有二进制操作我真的不确定它们是做什么的。

如果有帮助,这个对齐的大小用于创建这样的缓冲区。我相当确定 buffer 会自动分配字节对齐的内存,并从此用作制服的内存存储位置。

let buffer = self.device.makeBuffer(length:alignedUniformsSize * 3, options:[MTLResourceOptions.storageModeShared])

所以本质上,与其自己经历分配字节对齐内存的麻烦,他们让 metal 为他们做这件事。

他们在 let allignedUniformsSize = 时使用的策略是否有任何原因不适用于其他类型,例如 IntFloat等等?

最佳答案

让我们先谈谈为什么要对齐缓冲区,然后再谈谈按位运算。

我们的目标是分配一个 Metal 缓冲区,它可以存储三个(三重缓冲的)制服副本(这样我们就可以写入缓冲区的一部分,而 GPU 从另一部分读取)。为了从这三个副本中的每一个中读取,我们在绑定(bind)缓冲区时提供一个偏移量,类似于 currentBufferIndex * uniformsSize。某些 Metal 设备要求这些偏移量是 256 的倍数,因此我们需要使用类似 currentBufferIndex * alignedUniformsSize 的东西作为我们的偏移量。

我们如何将整数“四舍五入”到 256 的下一个最高倍数?我们可以通过舍弃“未对齐”大小的最低 8 位,有效地向下舍入,然后加上 256,从而得到下一个最高倍数。向下舍入部分是通过与 255 的 1 的补码 (~) 进行按位与运算来实现的,它(在 32 位中)是 0xFFFFFF00。四舍五入是通过添加 0x100 完成的,即 256。

有趣的是,如果基本大小已经对齐,这种技术无论如何都会虚假地向上舍入(例如,从 256 到 512)。对于整数除法的成本,您可以避免这种浪费:

let alignedUniformsSize = ((MemoryLayout<Uniforms>.size + 255) / 256) * 256

关于ios - 这段代码如何快速找到 Struct 的内存对齐大小?为什么需要二元运算?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46431114/

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com