【问题标题】:How can I have in a __m128 variable a whole complex number?如何在 __m128 变量中包含一个整数?
【发布时间】: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 中有整个复数?

【问题讨论】:

    标签: c x86 simd complex-numbers intrinsics


    【解决方案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 并行处理多个复数,请将实部和虚部存储在单独的数组中。
    猜你喜欢
    • 2012-03-21
    • 1970-01-01
    • 2023-04-03
    • 1970-01-01
    • 2020-06-03
    • 2011-11-24
    • 2013-10-21
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多