【发布时间】: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这很烦人,是的,你说得对,它真的很奇怪,我希望有一些一致性!