Xcode 不同SSE版本的通用二进制文件
我可以为Mac OS X创建一个通用二进制文件,其中包含我的应用程序的两个版本,一个使用SSE4.2编译,另一个使用SSE3编译 在这种情况下,我会自动加载使用SSE4.2编译的版本,以供支持SSE4.2的CPU使用 如果没有,我希望得到建议,在不支持SSE4.2的旧CPU上运行我的应用程序,但在支持SSE4.2的CPU上使用SSE4.2 请注意,我的目标是Mac AppStore,如果这有关系的话。Xcode 不同SSE版本的通用二进制文件,xcode,sse,universal-binary,Xcode,Sse,Universal Binary,我可以为Mac OS X创建一个通用二进制文件,其中包含我的应用程序的两个版本,一个使用SSE4.2编译,另一个使用SSE3编译 在这种情况下,我会自动加载使用SSE4.2编译的版本,以供支持SSE4.2的CPU使用 如果没有,我希望得到建议,在不支持SSE4.2的旧CPU上运行我的应用程序,但在支持SSE4.2的CPU上使用SSE4.2 请注意,我的目标是Mac AppStore,如果这有关系的话。 我在Xcode 4.5中使用Clang。Mach-O格式不支持这种格式,Mach-O格式由Ma
我在Xcode 4.5中使用Clang。Mach-O格式不支持这种格式,Mach-O格式由Mac OS X使用。这种格式允许不同体系结构的二进制文件。有一个子类型字段,但只有为不同代处理器定义的值,而不是它们的能力 有几种方法可以解决这个问题。一种是将SSE4.2和旧处理器的代码构建到同一个二进制文件中,使用不同的函数名。您的代码将确定是否支持SSE4.2,然后调用适当的函数 另一种选择是构建两个库,一个带SSE4.2,一个不带,并在应用程序包中提供这两个库,但不链接到它们。首次加载时,您的代码将确定是否支持SSE4.2,然后加载正确的库
使用第一种方法,您不必担心加载库和连接所有函数,但您将始终加载未执行的额外代码,并且您必须在每次调用这些函数之前检查一个变量。使用第二种方法,您可以简单地调用函数,而无需每次检查任何内容,但是加载库并连接所有函数比每次简单地比较一个变量要复杂得多。您需要做的只是:1)检测指令集。2) 分支到所需的版本。
\uuu cpuid()
内在特性特定于MSVC。在GCC中,您可以使用内联程序集访问它。虽然我不确定你在用什么,但应该有办法访问它。我不喜欢更改源代码文件,因为一些无法在旧CPU上运行的代码行来自第三方开源项目。如果你不能更改源代码,那么你可能会倒霉,除非你1)找到一个编译器选项。或者2)构建一个包装器。这就是为什么我想用两个版本的应用程序制作一个通用二进制文件。这也有利于将ceil和floor等标准操作转换为第二版本上的SSE4.1指令。