@
geekvcn 关于 SIMD 优化的技术我倒是一直想找人探讨一下,可惜很少看到讨论的帖子。
我之前在做一个视频滤镜的 SIMD 优化工作。有一块代码是数组里存的下标,然后用下标从另一个数组里找值,再存进寄存器里做后续的操作。当时我手动写完的汇编代码跑出来的速度远远比交给编译器优化的慢。我是百思不得其解,前后大概花了十几个小时进去研究为什么编译器跑出来的结果会比我的快。后来我发现之前写的代码,把数据存进数组然后做 _mm_load_si128,如果让编译器来优化的话,会直接重写成 _mm_insert_pi16,整段代码都被编译器完全打乱了,然后自动做了矢量化,最后每一帧的运行速度翻了一倍。后来写 AVX2 的时候,我发现要把几十行代码的循环整个 Unroll 成 16 遍,然后全部按照之前编译器优化的代码( _mm_insert_pi16 然后 _mm256_inserti128_si256 )来写才能勉强赶上编译器自动优化的 SSE,如果按照自己原先的优化(用 _mm256_load_si256 载入)来写的话慢出翔。
折腾了整整 3 天以后我把整个代码优化分支删了。去™的手动优化……