簡體   English   中英

使用SSE內部函數時結果不正確

[英]Incorrect results when using SSE intrinsics

我正在嘗試使用SSE內在函數對8個浮點數組的每個元素進行學習,只是為了學習如何使用它們。 但是,當我嘗試這樣寫時:

alignas(16) float Numbers[8] = 
{0.0f, 1.0f, 2.0f, 3.0f, 4.0f, 5.0f, 6.0f, 7.0f};    

__m128 Group1 = _mm_load_ps(Numbers);
__m128 Group2 = _mm_load_ps(Numbers + 4*sizeof(float));
__m128 Zero = _mm_setzero_ps();

__m128 Sum1 = _mm_add_ps(Group1, Group2);     // Sum1 = Group1 + Group2
__m128 Sum2 = _mm_hadd_ps(Sum1, Zero);        // Sum2[31:0] = Sum1[31:0] + Sum1[63:32]
                                              // Sum2[63:32] = Sum1[95:64] + Sum1[127:96]
__m128 Sum3 = _mm_hadd_ps(Sum2, Zero);        // Sum3[31:0] = Sum2[31:0] + Sum2[63:32]

float Result;
_mm_store_ss(&Result, Sum3);

Result是6,應該是28。我一直在引用這些內在函數的參考,但是我無濟於事。 有什么建議么?

嘗試更改此行

__m128 Group2 = _mm_load_ps(Numbers + 4*sizeof(float));

__m128 Group2 = _mm_load_ps(Numbers + 4);

(數字是float [],而不是char [])

@twin已經指出了主要問題,但我想我只想補充幾點:(a)您不需要零向量,(b)您不需要單獨的和向量-您可以就地完成所有操作,這應該更有效率。 這是我用gcc測試過的簡化代碼:

#include <stdio.h>
#include <pmmintrin.h>

int main()
{
    float Numbers[8] __attribute__ ((aligned(16))) =
        {0.0f, 1.0f, 2.0f, 3.0f, 4.0f, 5.0f, 6.0f, 7.0f};

    __m128 Group1 = _mm_load_ps(Numbers);
    __m128 Group2 = _mm_load_ps(Numbers + 4);

    __m128 Sum = _mm_add_ps(Group1, Group2);
    Sum = _mm_hadd_ps(Sum, Sum);
    Sum = _mm_hadd_ps(Sum, Sum);

    float Result;
    _mm_store_ss(&Result, Sum);

    printf("Result = %g\n", Result);

    return 0;
}

測試一下:

$ gcc -Wall -msse3 sum_ps.c && ./a.out
Result = 28

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM