【问题标题】:Why can't gcc or clang properly @encode SIMD vector types?为什么 gcc 或 clang 不能正确地@encode SIMD 向量类型?
【发布时间】:2014-05-22 11:59:34
【问题描述】:

在处理向量类型和 ObjC 运行时时,我遇到了一个非常令人困惑的问题。

据我所知,clang 或 GCC 都不会为任何 SIMD 向量类型提供“正确”的类型编码。

#import <Foundation/Foundation.h>

int main() {
    typedef int int4 __attribute__((vector_size(16)));
    typedef float float4 __attribute__((vector_size(16)));

    NSLog(@"Int4: %s", @encode(int4));
    NSLog(@"Float4: %s", @encode(float4));
}

当使用 GCC 或 clang 编译和运行时,我得到以下输出:

2014-04-09 06:21:01.102 测试[1707:507] Int4: 2014-04-09 06:21:01.103 测试[1707:507] Float4:

而不是我所期望的,这将是这样的:

2014-04-09 06:21:01.102 测试[1707:507] Int4: ![16,16i] 2014-04-09 06:21:01.103 测试[1707:507] Float4: ![16,16f]

根据文档here

vectors      '![' 后跟 vector_size(组成向量的字节数),后跟逗号,然后是向量的对齐方式(以字节为单位),然后是元素的类型,后跟 ']'

当尝试从 ObjC 方法返回这些类型时,这会成为一个问题,而不是像 ![16,16i]@: 这样的逻辑来编码以下方法:

-(int4) foo;

我只得到字符串@:,这会导致NSMethodSignatureNSInvocation 本质上是废话和段错误。

我可以启用一些编译器选项来恢复向量类型的正确编码吗?还是这里唯一的解决方案是“不要从 ObjC 方法返回向量”?

注意: 返回(或传递)指向向量的指针也无济于事,因为指向向量的指针的编码只是 ^,然后贪婪地匹配列表中的下一个参数,导致我的参数计数再次关闭。我想我可以将向量转换为void *,但这在当时确实是一个丑陋的黑客攻击。

【问题讨论】:

    标签: objective-c vector clang simd objective-c-runtime


    【解决方案1】:

    看起来这是一个已知问题,clang 显然已被修改为在这种情况下显示警告:https://github.com/llvm-mirror/clang/commit/024d9c65e9d3887045c82be09e4f630f19da48b4

    【讨论】:

      猜你喜欢
      • 2017-07-23
      • 2021-12-26
      • 1970-01-01
      • 2018-07-24
      • 1970-01-01
      • 1970-01-01
      • 2014-10-31
      • 1970-01-01
      • 2013-11-19
      相关资源
      最近更新 更多