如何在 __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 变量中包含一个整数?的主要内容,如果未能解决你的问题,请参考以下文章
如何从 16 x 8 位 __m128i 值中提取 32 x 4 位整数