如何在Mac OS X上使用AVX/pclmulqdq技术

23
我正在尝试编译一个使用新Intel处理器中的pclmulqdq指令的程序。我使用macports安装了GCC 4.6,但是当我编译使用内在_mm_clmulepi64_si128的程序时,我遇到了问题。
/var/folders/ps/sfjmtgx5771_qbqnh4c9xclr0000gn/T//ccEAWWhd.s:16:no such
instruction: `pclmulqdq $0, %xmm0,%xmm1'

看起来GCC能够从内置函数生成正确的汇编代码,但是汇编器无法识别该指令。

我已经使用macports安装了binutils,但问题仍然存在。我如何知道gcc正在使用哪个汇编器?XCode汇编器可能不支持它,但binutils汇编器应该支持。


如果您使用的是Xcode 4,则可能需要使用clang而不是老派的gcc-请参见此问题:http://stackoverflow.com/questions/5257375/does-xcode-4-have-support-for-avx - Paul R
为什么这个问题被踩了?它是一个完全有效的问题。 - void-pointer
1
空指针 - Stack Overflow 上的一些人很蠢。不要担心他们。而且他们总是成群结队地出现,所以只要有一个人这样做了,其他人就会跟着做。看看这个问题,你会笑出声来的(每次我读到他的行为和理由时都会咯咯笑):http://stackoverflow.com/questions/19017335/cmake-force-use-of-non-mt-boost-libraries。 - jww
5个回答

24
我的解决方案是将-Wa,-q添加到编译器标志中,这个方法更简单也有效。 根据as(版本1.38)的手册,-q选项将使用clang(1)集成的汇编器而不是基于GNU的系统汇编器。-Wa部分将选项传递给汇编器,类似于-Wl将参数传递给链接器。请注意保留原文中的HTML标签。

4
如果您在升级到10.9并使用brew安装gcc49后再次遇到此问题,这就是解决方法。请注意,CCFLAG应该是"-Wa,-q",其中-Wa将标志传递给汇编器,而-q是使其在Mavericks上运行良好的相关标志。 - Evan Senter
它与-flto不兼容。没有-flto它可以正常工作。 - Mohammad Alaggan

13

GNU汇编器(GAS)在Mac OS X上不受支持。

要使用AVX,我需要:

  • 使用MacPorts安装GCC;
  • 替换本机的OS X汇编器(/usr/bin/as)为调用clang汇编器的脚本。
  • 使用已安装的GCC(例如gcc-mp-4.7)编译程序。

奇怪的是,虽然clang汇编器支持AVX,但clang编译器不识别AVX指令,迫使采用上述丑陋的解决方法。


这对我在一些程序上起作用,但在其他程序上出现了以下错误:<code>error: invalid instruction mnemonic 'vcvttss2siq</code> 类型的错误。 - Alec Jacobson
1
@mangledorf 我也遇到了同样的问题;在我升级了clang之后,问题就解决了。 - Artefacto
1
以上链接目前似乎已经失效。可以在这里找到该脚本的可用版本。 - Anders Sjögren
@AndersSjögren 谢谢你,你刚刚救了我一命。我刚刚编辑了答案,加入了更新后的链接。 - void-pointer
我想知道,根据as的manpage,似乎只需添加“-q”标志即可完成相同的操作。那么,为什么不编写一个脚本,其主体只包含“/usr/bin/as -q $@”(不包括单引号),而不是实际上覆盖/usr/bin/as并直接使用clang呢? - Rahul Manne
1
@Conrado - OS X 带有 GNU 的 AS 版本 1.38:as-version 的结果为 Apple Inc version cctools-855, GNU assembler version 1.38。实际上,由于反向修补,它可能超过了 1.38。问题在于,GAS 比 SSE3、SSE4、AVX 等先进15年左右。 - jww

4

内置版本的as已经过时(在OS X 10.8.3中)。

/usr/libexec/as/x86_64/as -v

Apple Inc版本cctools-839,GNU汇编器版本1.38

似乎不存在适用于OS X的gas版本。(参见: 在OSX中安装GNU汇编器

通过脚本黑客使用clang汇编器是一种解决方法(正如Conrado PLG所指出的)。但是,它需要管理员权限并覆盖OS X捆绑的可执行文件,可能会被未来版本的OS X捆绑的新(但可能已过时)版本的as覆盖,存在风险。

那么是否有更好的解决方法呢?

为什么交叉GCC会调用本地的“as”?所述,似乎可以指定使用哪个“as”可执行文件和标志(使用“-specs = ...”)。解决问题的更干净的方法似乎是传递正确的“-specs”标志以调用clang汇编器。这不需要管理员权限,也不会因OS X更新而被破坏。如何执行此操作的确切细节尚待发现(任何人都可以吗?)。
如果此解决方法变得足够简单且透明,可能有必要将这些设置用作macport gcc的默认设置(或至少是变体),以便支持“-march = native”等选项。有一个configure.args设置(如https://trac.macports.org/browser/trunk/dports/lang/gcc48/Portfile中所示的“--with-as = $ {prefix} / bin / as”),可以进行替换。

1

1

只需使用

as --version

AVX在gas/binutils的2.18.50版本左右出现。


在使用Macports安装的gas中,binutils安装在哪里? - Walter
@Walter - AS和LD不作为Binutils的一部分安装。请参阅MacPorts邮件列表上的“在安装Binutils后AS位于何处?”(http://lists.macosforge.org/pipermail/macports-users/2015-April/038397.html)和Binutils错误跟踪器上的“请在configure.ac中为OS X启用AS和LD”(http://sourceware.org/bugzilla/show_bug.cgi?id=18997)。 - jww

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接