mkldnn的文件目录结构如下:
doc/:文档说明,基本在 http://intel.github.io/mkl-dnn/index.html 中已经展示
advanced/:关于int8量化和版本更新的说明
build/: 关于build、build_options和link
design/:关于memory layout(format)的图片
performance_considerations/:关于性能调试、基准、dump jit code
primitives/:关于mkdnn的primitives公式和使用说明
programming_model/:关于mkldnn基本概念、mkldnn API、添加primitives属性、编程模型的介绍,其中images很直观
usage_models/:关于inference、training的介绍以及它们使用int和bf16的介绍
cmake/: 用于linux、win、mac不同平台上的cmake文件
examples/:mkldnn各种sample code
scripts/:个人认为没什么用
include/:
mkldnn.h:对以下概念的创建、初始化、get、set、销毁的声明
mkldnn_memory
mkldnn_primitive
mkldnn_post_ops
mkldnn_<op>_forward
mkldnn_<op>_backward
mkldnn_engine
mkldnn_stream
mkldnn_sgemm
mkldnn.hpp:对 mkldnn.h 进行 C++ 的类封装
error:返回当前API的状态
handle:所有mkldnn中op类的基类,如 primitive_desc,mkldnn_primitive
memory:memory和memory描述、存储等相关操作
algorithm:对 eltwise, pooling 等的算法进行选择
primitive_attr:对 post_ops 进行设置
primitive_desc:Primitive descriptors 的数据结构
query:用于获得 Primitive descriptor 的相关信息
primitive:原语,即深度学习中各种op的抽象
post_ops:fuse op后的sum、eltwise操作
<op>_forward:是 primitive 的子类,实现各种前向推理 op 的定义
<op>_backward:是 primitive 的子类,实现各种反向传播 op 的定义
engine:指定cpu还是gpu
stream:用于对primitive的调度管理
reorder, concat, sum:其他 op 类型
mkldnn_debug.h:将mkldnn中各种数据结构转换成string
mkldnn_status2str(mkldnn_status_t v);
mkldnn_dt2str(mkldnn_data_type_t v);
mkldnn_fmt_kind2str(mkldnn_format_kind_t v);
mkldnn_fmt_tag2str(mkldnn_format_tag_t v);
mkldnn_prop_kind2str(mkldnn_prop_kind_t v);
mkldnn_prim_kind2str(mkldnn_primitive_kind_t v);
mkldnn_alg_kind2str(mkldnn_alg_kind_t v);
mkldnn_rnn_flags2str(mkldnn_rnn_flags_t v);
mkldnn_rnn_direction2str(mkldnn_rnn_direction_t v);
mkldnn_engine_kind2str(mkldnn_engine_kind_t v);
mkldnn_scratchpad_mode2str(mkldnn_scratchpad_mode_t v);
mkldnn_types.h :关于mkldnn中各种数据结构和宏定义
mkldnn_version_t;
mkldnn_status_t: success, out_of_memory;
mkldnn_data_type_t: f32;
mkldnn_format_kind_t: any;
mkldnn_format_tag_t: nchw;
mkldnn_normalization_flags_t;
mkldnn_convolution_desc_t;
mkldnn_pooling_desc_t;
mkldnn_inner_product_desc_t;
mkldnn_eltwise_desc_t;
mkldnn_engine_kind_t;
#define MKLDNN_ARG_SRC_0 1
src/:
common/:是cpu和ocl的头文件声明
cpu/:采用cpu实现op,包括avx,sse、纯cpu等
gemm/:gemm的float、bf16、s8x8s32的cpu实现
rnn/:rnn, gru、lstm的cpu实现
xbyak/:调用jit的库函数
jit_utils/:jit 的通用函数
cpu_xxx.hpp:针对cpu进行实现cpu的primitive descriptor
cpu_xxx.cpp
gemm_xxx.hpp:封装gemm/文件中的各种实现计算密集型的op,如convolution、inner product
gemm_xxx.cpp
Jit_avx2_xxx.hpp:采用avx2实现convolution op
Jit_avx2_xxx.cpp
Jit_avx512_xxx.hpp:采用avx512实现convolution 、bf16/f32 convolution
Jit_avx512_xxx.cpp
Jit_sse41_xxx.hpp:采用sse41实现convolution op
Jit_sse41_xxx.cpp
Jit_uni_xxx.hpp:采用cpu中的硬件特性实现通用的计算型op
Jit_uni_xxx.cpp
ref_xxx.hpp:采用纯cpu实现各种op
ref_xxx.cpp
ocl/:采用gpu实现op
tests/:
onednn不同版本的手册:https://oneapi-src.github.io/oneDNN/v1.5/dev_guide_matmul.html
AR:
(1)zero padding实现
(2)execute_forward_nCspBc_padded,execute_forward_dense,execute_forward_generic区别