【问题标题】:how to link against sse intrinsics when using icc on OS X在 OS X 上使用 icc 时如何链接 sse 内在函数
【发布时间】:2014-10-12 20:11:34
【问题描述】:

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

例如:

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;
}

要明确我确实想使用宏,对于那些好奇我为什么要这样做的人,我的主要目标是创建一个调度程序,最好在编译时创建,具体取决于编译器优化的力度有多大,但那是另一回事了。

$ 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

【问题讨论】:

  • 为内在函数编写自己的包装器? gcc/clang 将内在函数实现为它们自己的内置函数的内联包装器(在 -O0 处有一些例外,对于仅当一个参数是常量时才合法的内在函数)。
  • @MarcGlisse 不是一个坏主意,希望编译器足够聪明,可以将链折叠为原生指令,如果存在的话......
  • @MarcGlisse for the intrinsics that are only legal when one argument is a constant 我认为你的意思是立即,因为一些编译器甚至抱怨使用static const 这很烦人,是的,你说得对,它真的很奇怪,我希望有一些一致性!

标签: c clang sse ld icc


【解决方案1】:

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

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

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

【讨论】:

    猜你喜欢
    • 2021-02-17
    • 2010-10-25
    • 1970-01-01
    • 1970-01-01
    • 2011-01-04
    • 2012-12-12
    • 2013-03-11
    • 1970-01-01
    相关资源
    最近更新 更多