在 Xcode 4 (LLVM GCC) 中使用 _mm_shuffle_ps 时可能出现 OpenMP + SSE 错误
Posted
技术标签:
【中文标题】在 Xcode 4 (LLVM GCC) 中使用 _mm_shuffle_ps 时可能出现 OpenMP + SSE 错误【英文标题】:Possible OpenMP + SSE bug when using _mm_shuffle_ps in Xcode 4 (LLVM GCC) 【发布时间】:2011-11-12 23:20:57 【问题描述】:我已将我的编译器从 GCC 切换到 XCode 4.2 中的 LLVM GCC 4.2,并且在 OpenMP 下遇到了 _mm_shuffle_ps 内在函数的奇怪链接器错误。这个函数可以在其他地方工作,但是一旦我把它放在一个 omp 块中,它就会开始生成以下链接器错误:
"___builtin_ia32_shufps", referenced from:
__ZN7Annulus12traceFactorsEP9PrimitiveP8VFMatrix.omp_fn.0 in Annulus.o
ld: symbol(s) not found for architecture x86_64
collect2: ld returned 1 exit status
我的代码基本结构如下:
#pragma omp parallel
//Some stuff
#pragma omp for
//Do more stuff including _mm_shuffle_ps
代码在 GCC 4.2 中运行良好,所以这是 OpenMP 的 LLVM GCC 实现中的一个错误,还是我需要一个奇异的编译器标志?
【问题讨论】:
也许您应该告诉使用平台(CPU 架构?)和使用的编译器标志。看起来您缺少 ia32 特定功能,但您正在链接 x86_64 版本。也许编译器标志/定义已关闭 我在 MacPro(OS X 10.7.2、2.8 GHz 四核 Intel Xeon)上编译,但我也尝试在 MacPro(OS X 10.6.8、2 x 2.26 四核英特尔至强)。编译器标志是启用 OpenMP 和 SSE 的所有 Xcode 默认值。由于它在 OpenMP 块之外工作,我认为它不是我现有的设置。 【参考方案1】:完全是一个错误。请归档。谢谢。
【讨论】:
【参考方案2】:仅供参考:
我在这里遇到了同样的问题,但是使用了 shuf_pd 指令。其他内在函数工作得很好。我刚刚将该错误提交给 Apple。
可能有一个我还没有尝试过的解决方法:将所有 SSE 代码放入一个不同的函数中,然后从 OpenMP 循环中调用它。
【讨论】:
我还向 Apple 提交了一个错误。是的,我正在考虑将它放在另一个函数中,但是为了获得相同的性能,它必须是内联的,这可能仍然会产生错误。与此同时,我又回到了使用 GCC4.2以上是关于在 Xcode 4 (LLVM GCC) 中使用 _mm_shuffle_ps 时可能出现 OpenMP + SSE 错误的主要内容,如果未能解决你的问题,请参考以下文章
XCode 编译器 Apple LLVM 3.1 与 LLVM GCC 4.2
使用 arm-apple-darwin10-llvm-gcc-4.2 在 MacOS 上交叉编译问题