簡體   English   中英

sse2浮點乘法

[英]sse2 float multiplication

我試圖將一些代碼從FANN Lib(用C語言編寫的神經網絡)移植到SSE2。 但是SSE2的性能比普通代碼差。 使用我的SSE2實現運行一次運行需要5.50分鍾而不需要5.20分鍾。

SSE2怎么能比正常運行慢? 可能是因為_mm_set_ps 我使用Apple LLVM編譯器(XCode 4)編譯代碼(所有SSE擴展標志都打開,優化級別為-Os )。

沒有SSE2的代碼

                neuron_sum +=
                fann_mult(weights[i], neurons[i].value) +
                fann_mult(weights[i + 1], neurons[i + 1].value) +
                fann_mult(weights[i + 2], neurons[i + 2].value) +
                fann_mult(weights[i + 3], neurons[i + 3].value);

SSE2代碼

                __m128 a_line=_mm_loadu_ps(&weights[i]);
                __m128 b_line=_mm_set_ps(neurons[i+3].value,neurons[i+2].value,neurons[i+1].value,neurons[i].value);
                __m128 c_line=_mm_mul_ps(a_line, b_line);
                neuron_sum+=c_line[0]+c_line[1]+c_line[2]+c_line[3];

要有機會在這里看到加速,您需要執行以下操作:

  • 確保weights[i]是16字節對齊,然后使用_mm_load_ps而不是_mm_loadu_ps
  • 重新組織neurons[]以便它是SoA而不是AoS(也是16字節對齊),然后使用_mm_load_ps加載4個值
  • 將水平和移出循環(有一個循環,對吧?) - 只需在向量vneurom_sum保留4個部分和,然后在循環后對該向量進行一個最終水平求和

即使這樣,你也不會看到巨大的加速,因為你只對2個負載和1個存儲進行一次算術運算。 由於大多數現代x86 CPU都有兩個標量FPU,你可能無法接近128位浮點SIMD的理論4倍加速,我估計相對於標量代碼加速不超過50%。

暫無
暫無

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

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