在OS X上使用icc时如何链接sse内在函数

时间:2014-10-12 20:11:34

标签: c clang sse ld icc

不确定 gcc ,但是使用 clang 我可以使用sse内在的地址,没有太多麻烦,不幸的是当我尝试使用时相同的东西OS X上的icc ,它失败了,确切地说链接器无法找到底层函数...

例如:

sse.h:

#include <immintrin.h>

static __m128i (*load)(const __m128i *) = &_mm_load_si128;

main.c中:

#include <stdio.h>
#include "sse.h"

int main(void) {

    char buffer[sizeof(__m128i)] __attribute__((aligned(sizeof(__m128i))));

    __m128i b = load((void *)buffer);
    printf("%i\n", _mm_extract_epi16(b, 0));
    return 0;
}

要明确我 NOT 想要使用宏,对于那些好奇我为什么会这样做的人,我的主要目标是创建一个调度程序,最好是在编译时,取决于编译器优化的程度如何,但这是另一个故事。

$ gcc main.c -O0
$
$ gcc --version
Configured with: --prefix=/Applications/Xcode.app/Contents/Developer/usr --with-gxx-include-dir=/usr/include/c++/4.2.1
Apple LLVM version 6.0 (clang-600.0.51) (based on LLVM 3.5svn)
Target: x86_64-apple-darwin13.4.0
Thread model: posix
$
$ icc main.c -O0
Undefined symbols for architecture x86_64:
  "__mm_load_si128", referenced from:
      _load in icckt7T6c.o
ld: symbol(s) not found for architecture x86_64
$ icc --version
icc (ICC) 13.0.0 20120731
Copyright (C) 1985-2012 Intel Corporation.  All rights reserved.
$
$ uname -a
Darwin *****-MacBook-Pro.local 13.4.0 Darwin Kernel Version 13.4.0: Sun Aug 17 19:50:11 PDT 2014; root:xnu-2422.115.4~1/RELEASE_X86_64 x86_64

1 个答案:

答案 0 :(得分:0)

我不知道编写一次代码的好解决方案,然后能够将其编译为256位AVX或128位SSE。我很确定这不是它。

请注意,icc在出现问题之前已经到了链接阶段。也许如果你打开优化,它会内联调用而不是将其作为符号引用。

但是,您绝对需要编译器内联对函数指针的调用。通过函数指针运行单个SSE指令将生成快速代码。 (例如,如果编译器使函数遵循通常的ABI,其中所有xmm寄存器都是调用者保存的(即必须假设被调用者破坏了它们)。)