其他分享
首页 > 其他分享> > c-_mm_cvtsd_f64类似物,用于更高阶的浮点

c-_mm_cvtsd_f64类似物,用于更高阶的浮点

作者:互联网

我在玩SIMD,想知道为什么没有类似_mm_cvtsd_f64的类来从__m128d引出高阶浮点.

GCC 4.6进行了扩展,可以很好地实现此目的:

__m128d a = ...;
double d1 = a[0];
double d2 = a[1];

但是在较旧的GCC(即4.4.)上,我唯一能设法做到这一点的方法是使用__builtin_ia32_vec_ext_v2df定义自己的模拟函数,即:

extern __inline double __attribute__((__gnu_inline__, __always_inline__, __artificial__))
_mm_cvtsd_f64_h (__m128d __A)
{
  return __builtin_ia32_vec_ext_v2df (__A, 1);
}

__m128d a = ...;
double d1 = _mm_cvtsd_f64(a);
double d2 = _mm_cvtsd_f64_h(a);

这真的是要走的路吗?是否有其他选择不使用潜在于编译器的__builtin东西?再次-为什么没有_mm_cvtsd_f64_h或类似的预定义?

我可以想到的这个替代方法慢得多:

_mm_cvtsd_f64_h(__m128d __A) {
    double d[2];
    _mm_store_pd(d, __A);
    return d[1];
}

解决方法:

我建议您使用以下代码:

inline static _mm_cvtsd_f64_h(__m128d x) {
    return _mm_cvtsd_f64(_mm_unpackhi_pd(x, x));
}

这可能是获取xmm寄存器上半部分的最快方法,并且与MSVC / icc / gcc / clang兼容.

标签:c-3,c,performance,intrinsics,simd
来源: https://codeday.me/bug/20191012/1899629.html