objective-c - 解释 Metal 和 SIMD 中的不同类型
问题描述
在使用 Metal 时,我发现类型的数量令人眼花缭乱,而且我并不总是清楚应该在哪种情况下使用哪种类型。
在 Apple 的 Metal Shading Language Specification 中,有一个非常清晰的表格,说明 Metal 着色器文件中支持哪些类型。但是,有大量可用的示例代码似乎使用了 SIMD 中的其他类型。在 macOS(Objective-C)方面,Metal 类型不可用,但 SIMD 类型可用,我不确定应该使用哪些。
例如:
在 Metal Spec 中,float2
它被描述为代表两个浮动组件的“矢量”数据类型。
在应用程序方面,以下所有内容似乎都以某种身份被使用或表示:
float2
,typedef ::simd_float2 float2
在vector_types.h中注意:“在 C 或 Objective-C 中,此类型可用作 simd_float2。”
vector_float2
,即typedef simd_float2 vector_float2
注意:“此类型已弃用;您应该改用 simd_float2 或 simd::float2”
simd_float2
,即typedef __attribute__((__ext_vector_type__(2))) float simd_float2
::simd_float2
和simd::float2
?
矩阵类型也存在类似情况:
matrix_float4x4
,simd_float4x4
,::simd_float4x4
和float4x4
,
有人可以解释一下为什么有这么多看似重叠功能的 typedef 吗?如果您今天(2018 年)在 Objective-C / Objective-C++ 中编写一个新应用程序,您应该使用哪种类型来表示两个浮点值(x/y)以及可以在应用程序代码和 Metal 之间共享的矩阵变换的类型?
解决方案
带有vector_
和matrix_
前缀的类型已被弃用,取而代之的是带有simd_
前缀的类型,因此一般指导(float4
用作示例)将是:
- 在 C 代码中,使用
simd_float4
类型。(除非您提供自己的前缀,否则您必须包含前缀typedef
,因为 C 没有名称空间。) - 与 Objective-C 相同。
- 在 C++ 代码中,使用
simd::float4
类型,您可以将其缩短float4
为using 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
命名空间导出。它还别名float4
为vector_float4
. 因此,您可以为此向量类型使用上述任何名称(除了simd_float4
)。更喜欢float4
.
推荐阅读
- tensorflow - 在 Keras/tf 中解池
- laravel - 如何在laravel中设计多向和多向关系?
- php - 如果扩展名错误,请取消链接文件
- caching - 争用内存中的读取共享数据?
- java - 不兼容的类型:单元格到字符串任何想法如何解决问题?
- reactjs - TypeError: Object(...) is not a function error ,在 reactJS 中通过提供者传递存储时
- azure-resource-manager - 从 ARM 模板创建的 Web 应用程序 - 无法断开部署
- c++ - CGAL 2D 三角剖分:仅获取内部三角形
- python - 神经网络风格GAN风格混合麻烦
- r - 使用 r 自动选择 .csv 文件中的行和列