C++: GCC编译选项-O1, -O2, -O3

GCC中这几个编译选项-O1, -O2, -O3是编译器的优化选项,作为使用者,这里仅了解一下三个编译选项对应的优化内容。详细可以参考回答 -O1 (or -O) 在不影响编译速度的前提下,尽量减少代码大小以及运行速度。 -O2 牺牲部份编译速度,使用所有支持的优化算法以提高运行速度(包括-O1的) -O3 除了-O2中的优化算法,还采用向量化算法,以及其余方法提高并行度以及运行效率(流水线、cache等)。 此外,还有其余许多优化编译选项,可见上面的连接。

Mac OS 使用OpenMP

今天做高性能作业,发现OS X的GCC(其实是clang,对编译器了解不多,今天又沉浸在wiki百科的大牛故事中)没有包含openmp,不支持-fopenmp编译选项,所以查了一下MAC OS上使用Open MP的简便方案。参见StackOverflow homebrew安装libomp brew install libomp 编译时增加选项 g++ -Xpreprocessor -fopenmp main.cpp -o main -lomp -std=c++11 -Xpreprocessor选项将参数-fopenmp传递给openmp预处理程序。

数据读取之Endianness

在读取MNIST数据集时,要注意的一个事情是,MNIST的数据存储采用的是high endian(也作big endian,即大端),高位字节存储在低位。big endian通常为网络中传输数据使用的字节序。 与big endian相对的是little endian,通常我们使用的Intel、amd处理器都是使用这种字节序的,两者的区别可见wikipedia。 所以,在加载MNIST数据集时,我们需要将字节序反过来,例如,在Julia中,可以使用下面函数 # convert “0x60ea0000” to “0x0000ea60” ntoh(x)