对用于 Objective-C 运行时的 SIMD 类型和函数进行编码的正确方法是啥?

Posted

技术标签:

【中文标题】对用于 Objective-C 运行时的 SIMD 类型和函数进行编码的正确方法是啥?【英文标题】:What is the proper way to encode SIMD types and functions that use them for the Objective-C Runtime?对用于 Objective-C 运行时的 SIMD 类型和函数进行编码的正确方法是什么? 【发布时间】:2017-06-16 20:59:21 【问题描述】:

我正在用 Objective-C 以外的语言开发应用程序,我遇到了newBoxWithDimensions。它使用来自 SIMD API 的 vector_float3 类型。

由于vector_float3 类型,我无法对该函数进行编码。

我找到了Why can't gcc or clang properly @encode SIMD vector types?;这里的问题是当@encode 没有对 SIMD 类型进行编码时,它无法为那些使用 SIMD 类型的函数创建适当的形式,然后消息发送验证失败。消息发送验证如何绕过这个编码问题?

【问题讨论】:

您能否重新表述您的问题,以便清楚您遇到了什么问题? @E_net4 和 Shepmaster 我的问题仍然是正确的,因为问题仍然存在,我只是绕过它。必须有某种方法来克服这个问题,我认为其他语言正在以某种方式管理它。如果我有时间,我会看看他们。如果我在那里找到我的答案,是的,我当然会在下面发布我自己的答案! 我知道问题标题有点笼统,但对于遇到同样问题的人来说,这可能是一个很好的起点,我认为这是他们脑海中的第一件事。也许问题正文需要稍作修改。 【参考方案1】:

作为一个实验,我请求+newBoxWithDimensions:segments:geometryType:inwardNormals:allocator: 的方法签名,使用:

NSMethodSignature* sig = [MDLMesh methodSignatureForSelector:@selector(newBoxWithDimensions:segments:geometryType:inwardNormals:allocator:)];

然后我列举了它的参数和它们的类型编码。事实证明,签名只是跳过了两个向量参数。一共显示了5个参数,包括隐含的self_cmd参数,应该有7个。编码是“@”,“:”,“q”,“c”,“@”,前两个对应self_cmd,后三个匹配方法的最后三个参数。

我认为您最安全的方法是编写一个 Objective-C 模块,该模块导出一个包装此方法的函数,但向量组件是单独传递的(即三个 float 参数用于维度,三个 unsigned int 参数用于段)。它将从这些单独的参数构造向量参数并调用类方法,返回其结果。

【讨论】:

I think your safest approach ... 这正是我不喜欢的。 我只接受这个编码建议,我认为这是正确的,我很快就会测试它。 嗯,这不是建议。我认为 Objective-C 运行时无法处理向量参数并崩溃(如您所见)。我打算确认一下。我不知道锈。它能否处理返回具有给定 C 签名的函数指针的 API?您可以调用[MDLMesh methodForSelector:@selector(newBox...)],然后将结果视为MDLMesh *(*)(id, SEL, vector_float3, vector_uint3, MDLGeometryType, BOOL, id<MDLMeshBufferAllocator>)【参考方案2】:

Rust 的变通解决方案

对于那些使用 Rust 并遇到同样问题的人,我找到了绕过错误的解决方法,但请记住,问题仍然存在,我的解决方案会使开发人员在调试过程中盲目。

如果您使用的是 objc crate,请尝试从您的 crate 中删除 verify_message 功能,否则不要进行消息验证。 使用simd 表示您的矢量数据并将您的数据放入您的消息中,无需任何编码。 在这种情况下,您在开发过程中非常盲目,我建议的一种方法是将您的调试带入 Xcode(这也不好!)。

【讨论】:

以上是关于对用于 Objective-C 运行时的 SIMD 类型和函数进行编码的正确方法是啥?的主要内容,如果未能解决你的问题,请参考以下文章

如何从objective-c中的simd_float4获取值

我可以将 SIMD 内在函数用于在云上运行的软件吗?

我可以将SIMD内在函数用于在云上运行的软件吗?

swift SIMD。用于对小矢量和矩阵执行计算的模块。

双精度数组上的 SIMD?

SIMD值得吗?有更好的选择吗?