gpt4 book ai didi

objective-c - 解释 Metal 和 SIMD 中的不同类型

转载 作者:太空狗 更新时间:2023-10-30 03:58:09 24 4
gpt4 key购买 nike

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

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

例如:

在 Metal 规范中,float2 被描述为表示两个 float 组件的“向量”数据类型。

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

  • float2,即vector_types.h中的typedef::simd_float2 float2

    注意:“在 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_float2simd::float2 ?

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

  • matrix_float4x4, simd_float4x4, ::simd_float4x4float4x4,

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

最佳答案

带有 vector_ 的类型和 matrix_前缀已被弃用,取而代之的是带有 simd_ 的前缀。前缀,因此一般指导(以 float4 为例)将是:

  • 在 C 代码中,使用 simd_float4类型。 (除非您提供自己的 typedef ,否则您必须包含前缀,因为 C 没有 namespace 。)
  • 对于 Objective-C 也是如此。
  • 在 C++ 代码中,使用 simd::float4类型,您可以将其缩短为 float4通过 using namespace simd; .
  • 对于 Objective-C++ 也是如此。
  • 在 Metal 代码中,使用 float4类型,因为 float4是 Metal 着色语言 [1] 中的基本类型。
  • 在 Swift 代码中,使用 float4类型,因为 simd_类型被别名为较短的名称。
  • 更新:在 Swift 5 中,float4和相关类型已被弃用,取而代之的是 SIMD4<Float>和相关类型。

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

关于打包类型的讨论改天再说,因为你没有问。

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

关于objective-c - 解释 Metal 和 SIMD 中的不同类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51790490/

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