[英]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.