弱爆了,连帮我把卷积自动“优化”成FFT加速的都做不到。
另外,如果你写:
struct MyVec4i { MyVec4i( int a, int b, int c, int d ) { values = _mm_set_epi32( d, c, b, a ); } MyVec4i operator+( MyVec4i peer) { MyVec4i re; re.values = _mm_add_epi32( values, peer.values ); return re; } __m128i values; } // 使用处 MyVec4i v1(1,2,3,4); MyVec4i v2(5 6 7 8); MyVec4i result = v1 + v2;
MSVC:我特么就是要往内存里放。
话题太大,码字花时间…
先放传送门好了。
请看Google的C++编译器组老大Chandler Carruth的演讲。这个演讲是从编译器研发工程师的角度出发,以Clang/LLVM编译C++为例,向一般C++程序员介绍理解编译器优化的思维模型。它讲解了C++编译器会做的一些常见优化,而不会深入到LLVM具体是如何实现这些优化的,所以即使不懂编译原理的C++程序员看这个演讲也不会有压力。
Understanding Compiler Optimization - Chandler Carruth - Opening Keynote Meeting C++ 2015
录像:https://www.youtube.com/watch?v=FnGCDLhaxKU(打不开请自备工具…)
Agner Fog写的优化手册也永远是值得参考的文档。其中的C++优化手册:
Optimizing software in C++ - An optimization guide for Windows, Linux and Mac platforms - Agner Fog要稍微深入一点的话,GCC和LLVM的文档其实都对各自的内部实现有不错的介绍。
GCC:
GNU Compiler Collection (GCC) InternalsLLVM:
LLVM’s Analysis and Transform Passes========================================
反模式(anti-patterns)
1. 为了“优化”而减少源码中局部变量的个数
这可能是最没用的手工“优化”了。特别是遇到在高级语言中“不用临时变量来交换两个变量”这种场景的时候。
看另一个问题有感:
有什么像a=a+b;b=a-b;a=a-b;这样的算法或者知识? - 编程2. 为了“优化”而把应该传值的参数改为传引用
(待续…)