【问题标题】:Universal binary for different SSE versions不同 SSE 版本的通用二进制文件
【发布时间】:2012-09-23 22:05:25
【问题描述】:

我能否为 Mac OS X 创建一个通用二进制文件,其中包含两个版本的应用程序,一个是用 SSE4.2 编译的,一个是用 SSE3 编译的?

在这种情况下,我会为支持 SSE4.2 的 CPU 自动加载使用 SSE4.2 编译的版本。

如果不是,我想获得建议,以便在不支持 SSE4.2 但在支持它的 CPU 上使用 SSE4.2 的旧 CPU 上运行我的应用程序。

请注意,我的目标是 Mac AppStore,如果有的话。 我在 Xcode 4.5 中使用 Clang。

【问题讨论】:

  • 所有你需要做的是:1)检测指令集。 2) 分支到你想要的版本。
  • My answer here shows how to detect the instruction set. __cpuid() 内在函数特定于 MSVC。在 GCC 中,您可以使用内联汇编访问它。虽然我不确定你在使用什么,但应该有一种访问它的方法。
  • 我不喜欢更改源代码文件,因为一些无法在旧 CPU 上运行的行来自第三方开源项目。
  • 如果您无法更改源代码,那么您可能不走运,除非您 1) 找到一个编译器选项来执行此操作。或者 2) 构建一个包装器。
  • 这就是为什么我正在寻找使用两个版本的应用程序制作通用二进制文件的原因。这也将有利于标准操作,如 ceil 和 floor 将在第二个版本中转换为 SSE4.1 指令。

标签: xcode sse universal-binary


【解决方案1】:

Mac OS X 使用的 Mach-O 格式不支持此功能。该格式允许二进制文件用于不同的体系结构。有一个子类型字段,但只有为不同代处理器定义的值,而不是它们的能力。

有几种方法可以解决这个问题。一种方法是将 SSE4.2 和旧处理器的代码内置到相同的二进制文件中,使用不同的函数名称。您的代码将确定是否支持 SSE4.2,然后调用正确的函数。

另一种选择是构建两个库,一个使用 SSE4.2,一个不使用,并将它们都发送到您的应用程序包中,但不链接到它们。首次加载时,您的代码将确定是否支持 SSE4.2,然后加载正确的库。

使用第一种方法,您不必担心加载库和连接所有函数,但您总是会加载额外的代码,这些代码不会被执行,并且您必须在每个之前检查一个变量那些函数调用。使用第二种方法,您可以简单地调用函数而无需每次检查任何内容,但是加载库并连接所有函数比每次都简单地比较一个变量要多。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-05-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-09-14
    • 1970-01-01
    相关资源
    最近更新 更多