如何在 __m128 变量中包含一个整数?

Posted

技术标签:

【中文标题】如何在 __m128 变量中包含一个整数?【英文标题】:How can I have in a __m128 variable a whole complex number? 【发布时间】:2016-10-14 20:25:14 【问题描述】:

我没有太多在 C 中使用内部函数的经验。我的问题是有这个函数

void function(complex float* A, complex float* B, complex float alpha) 

我想使用像 __m128 这样的 alpha,但如果我这样做

__m128 alfa = _mm_load_ps((float const *)&alpha);

alfa 只获取复数的实部。

我怎样才能在__m128 alfa 中有整个复数?

【问题讨论】:

【参考方案1】:

这段代码对我来说很好用:

complex float a __attribute__ ((aligned (16))) = 5 + 10*I;
__m128 f = _mm_load_ps((float const *)&a); // requires 16B alignment
float *p = (float *)&f;
printf("real(0): %f, imag(1): %f, (2): %f, (3): %f\n", p[0], p[1], p[2], p[3]);

打印

real(0): 5.000000, imag(1): 10.000000, (2): 0.000000, (3): 0.000000

你确定alpha 有一个非零虚部吗?你怎么知道你只得到了真正的部分?

【讨论】:

我试过这个复杂的 float alphaA attribute ((aligned (16))) = alpha; 后跟这个表达式 __m128 alfa = _mm_load_ps((float const *)&alphaA);但我得到了你的打印结果:real(0): 0.335223, imag(1): -0.911647, (2): 0.335223, (3): -0.911647。问题是我想将 2 个复数相乘,所以我认为这就是这样做的方法。你知道乘法是怎么做的吗? 阿尔法有什么价值? @CSR95:您是否尝试过让编译器使用常规的* C 运算符自动向量化乘法?这就是拥有complex 类型而不是让您定义自己的结构的意义所在。 (C 本质上带有运算符重载的复数类型)。 Clang 对需要一些改组的自动矢量化更具侵略性,就像这样。 gcc 可能会分别做每一项。如果您打算使用 SIMD 并行处理多个复数,请将实部和虚部存储在单独的数组中。

以上是关于如何在 __m128 变量中包含一个整数?的主要内容,如果未能解决你的问题,请参考以下文章

如何将 __m128 反转为整数

在 __m128i 向量上水平检查零?

如何从 16 x 8 位 __m128i 值中提取 32 x 4 位整数

如何在变量 $File Equals 中使用的文件名中包含变量

如何使用 SSE 将 _m128i 转换为无符号整数?

如何在 AVX 寄存器上打包 16 个 16 位寄存器/变量