【发布时间】:2018-05-02 14:12:19
【问题描述】:
我正在尝试将 SIMD 内在函数与 XCode 7.1 中的 C 程序一起使用。 (注意,我正在编写 C99 程序,而不是 C++ 程序)。
我已经包含了 immintrin.h,并且我已经使用运行良好的内部命令编写了几个函数。我现在正在尝试编写一个函数,将 __m128 中的四个浮点数相加如下:
float cimpl_sum_m128( __m128 x ){
float out;
__m128 sum = x;
sum = _mm_hadd_ps( sum, sum );
sum = _mm_hadd_ps( sum, sum );
out = _mm_cvtss_f32( sum );
return out;
}
XCode 无法识别 _mm_cvtss_f32 命令。我应该注意到我从这个网站得到了命令:https://software.intel.com/sites/landingpage/IntrinsicsGuide/。
谁能向我解释为什么 XCode 不能识别这个命令。如果我不能使用 _mm_cvtss_f32,如何从 __m128 变量中提取单个值?
以后我想用_mm256_cvtss_f32;这可能吗?如果没有,如何从 __m256 变量中提取单个值?
【问题讨论】:
-
您是否在启用 AVX 的情况下进行编译(
-mavx,或者可能是-march=native)? -
不确定它是否相关,但与新的 Swift 相关,以及版本 2 和 3 之间的许多变化(首先可能是 3 不向后兼容(用 2 编写的代码在 3 中编译) ),也许还有另一种方法可以执行该“命令”?
-
@ringø:我认为这与 Swift 无关(检查标签)。
-
您确定为
_mm_cvtss_f32启用了SSE 吗?您不是在禁用 SSE 的 32 位模式下编译,是吗? Linux Clang/LLVM 很好地支持这两种内在函数 (godbolt.org/g/QitQgz)。_mm256_cvtss_f32当然需要-mavx或-march以间接启用-mavx。 你得到了什么确切的错误信息? -
顺便说一句,
_mm_hadd_ps花费 2 次随机播放 + 1 次添加,而您本可以在每个缩小步骤中使用 1 次随机播放 + 1 次添加。请参阅stackoverflow.com/questions/6996764/…了解优化的float hsum256_ps_avx(__m256 v)(以及带有 AVX 或各种 SSE 级别的__m128版本,以及整数和__m128d)。
标签: c xcode simd intrinsics