首页 > 解决方案 > 解释 Metal 和 SIMD 中的不同类型

问题描述

在使用 Metal 时,我发现类型的数量令人眼花缭乱,而且我并不总是清楚应该在哪种情况下使用哪种类型。

在 Apple 的 Metal Shading Language Specification 中,有一个非常清晰的表格,说明 Metal 着色器文件中支持哪些类型。但是,有大量可用的示例代码似乎使用了 SIMD 中的其他类型。在 macOS(Objective-C)方面,Metal 类型不可用,但 SIMD 类型可用,我不确定应该使用哪些。

例如:

在 Metal Spec 中,float2它被描述为代表两个浮动组件的“矢量”数据类型。

在应用程序方面,以下所有内容似乎都以某种身份被使用或表示:





矩阵类型也存在类似情况:


有人可以解释一下为什么有这么多看似重叠功能的 typedef 吗?如果您今天(2018 年)在 Objective-C / Objective-C++ 中编写一个新应用程序,您应该使用哪种类型来表示两个浮点值(x/y)以及可以在应用程序代码和 Metal 之间共享的矩阵变换的类型?

标签: objective-cmacoscocoasimdmetal

解决方案


带有vector_matrix_前缀的类型已被弃用,取而代之的是带有simd_前缀的类型,因此一般指导(float4用作示例)将是:

  • 在 C 代码中,使用simd_float4类型。(除非您提供自己的前缀,否则您必须包含前缀typedef,因为 C 没有名称空间。)
  • 与 Objective-C 相同。
  • 在 C++ 代码中,使用simd::float4类型,您可以将其缩短float4using namespace simd;.
  • 与 Objective-C++ 相同。
  • 在 Metal 代码中,使用float4类型,因为float4它是 Metal Shading Language [1] 中的基本类型。
  • 在 Swift 代码中,使用float4类型,因为simd_类型被别名为更短的名称。
  • 更新:在 Swift 5 中,float4相关类型已被弃用,取而代之的是SIMD4<Float>相关类型。

这些类型在本质上都是等效的,并且都具有相同的大小和对齐特性,因此您可以跨语言使用它们。那其实就是simd框架的设计目标之一。

既然你没有问,我会把关于打包类型的讨论留到另一天。

[1] Metal 是一个不寻常的情况,因为它float4在全局命名空间中定义,然后将其导入metal命名空间,该命名空间也作为simd命名空间导出。它还别名float4vector_float4. 因此,您可以为此向量类型使用上述任何名称(除了simd_float4)。更喜欢float4.


推荐阅读