安装必要的库
Eigen3
1 | 执行命令: |
示例程序
1 | //g++ -I/usr/local/include/eigen3 1.cpp -o 1 |
MKL
官网下载安装包https://software.intel.com/en-us/mkl
1 | tar -zxvf l_mkl_2019.0.117.tgz |
MKL-DNNL
官网下载编译好的包即可,然后-I加头文件路径,-L加so路径,LD_LIBRARY_PATH实际的so代码路径
MKL_INCDIR=/opt/composer_xe_2013.2.146/mkl/include
MKL_LIBDIR=/opt/composerxe/mkl/lib/intel64/
MKL_RT_LIBDIR=/opt/composer_xe_2013/lib/intel64/
#DNNLROOT=/home/resources/lizhipeng/dense-matrix-mult/MKL/mkldnn_lnx_1.0.4_cpu_iomp
DNNLROOT=/home/yx.wang/dnnl_lnx_1.1.1_cpu_iomp
gcc \
-I $MKL_INCDIR -I $DNNLROOT/include \
-L $MKL_LIBDIR -L /home/yx.wang/dnnl_lnx_1.1.1_cpu_iomp/lib/ -ldnnl \
-L $MKL_RT_LIBDIR \
-O4 -msse2 -msse3 -msse4 \
dense_mult_mkl.c \
-Wl,–start-group -lmkl_sequential -lmkl_core -lmkl_intel_lp64 -Wl,–end-group \
-lm -lpthread \
-o a.out
示例测试程序
1 |
|
Eigen
INCDIR=/usr/include/eigen3/
g++ \
-I $INCDIR \
-O4 -msse2 -msse3 -msse4 \
dense_mult_eigen.cpp \
-fopenmp \
-o ap.out
g++ \
-I $INCDIR \
-O4 -msse2 -msse3 -msse4 \
-DEIGEN_DONT_PARALLELIZE \
dense_mult_eigen.cpp \
-o a.out
1 | /* dense_mult_eigen.cpp |
测试结果
AVX16 单线程CPU | |||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|
矩阵大小 | Float16 | Int16 | Int8 | ||||||||
M | N | K | MKLDNN | MKL | Eigen3 | MKLDNN | MKL | Eigen3 | MKLDNN | MKL | Eigen3 |
5 | 2048 | 1320 | 0.001295 | 0.001204 | 0.002072 | \ | 0.001089 | 0.005318 | 0.038058 | 0.000793 | 0.006 |
5 | 512 | 2048 | 0.000763 | 0.000498 | 0.000786 | \ | 0.000539 | 0.001926 | 0.017806 | 0.000354 | 0.002 |
5 | 2048 | 512 | 0.000679 | 0.000475 | 0.000801 | \ | 0.000490 | 0.002057 | 0.017584 | 0.000317 | 0.002 |
5 | 2048 | 2048 | 0.002650 | 0.002028 | 0.003185 | \ | 0.002116 | 0.007945 | 0.080426 | 0.001405 | 0.009 |
5 | 2457 | 2048 | 0.003639 | 0.002482 | 0.003942 | \ | 0.002531 | 0.009683 | 0.096175 | 0.001714 | 0.011: |
OpenBLAS似乎是实现密集密集矩阵乘法的最佳库(至少是我测试过的机器的w.r.t)。随着核心数量的增加和矩阵的尺寸的增加,它可以很好地扩展。
对于多线程应用程序,
OpenBLAS>MKL>ATLAS>>EIGEN>ACML
对于单线程应用,
OpenBLAS≈ACML>MKL>ATLAS>>EIGEN
也许下次我会把稀疏稠密矩阵乘法的一些比较,
源代码
我已经附上了源代码的程序和绘图脚本在这里以及在