我尝试将一些代码从FANN Lib (用C编写的神经网络)移植到SSE2。但是SSE2的性能比正常代码更差。在我的SSE2实现运行中,一次运行需要5.50分钟,而不需要5.20分钟。
SSE2怎么会比正常运行慢呢?会不会是因为_mm_set_ps?我使用Apple LLVM Compiler (SSE4)编译代码(所有XCode扩展标志都为on,优化级别为-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];发布于 2012-03-27 04:37:56
要在这里看到任何加速的机会,您需要执行以下操作:
weights[i]是16字节对齐的,然后使用_mm_load_ps而不是_mm_loadu_psneurons[],这样它就是SoA而不是AoS (也是16字节对齐的),然后使用_mm_load_ps一次加载4个值vneurom_sum中保留4个部分和,然后在循环<代码>H212<代码>F213之后对该向量执行一次最终的水平求和即使这样,你也不会看到很大的加速,因为你只对2次加载和1次存储进行了一次算术运算。因为大多数现代x86 CPU都有两个标量浮点FPU,所以你可能无法接近128位浮点SIMD的4倍理论加速,我预计相对于标量代码,速度不会超过50%。
https://stackoverflow.com/questions/9879081
复制相似问题