Transitioning from Intel MKL-DNN to oneDNN {#dev_guide_transition_to_dnnl}
==========================================================================

To simplify library naming and differentiate it from Intel MKL, starting with
version 1.1 the library name is changed to
**Deep Neural Network Library (DNNL)**.

@note The subsequent library name change to
oneAPI Deep Neural Network Library (oneDNN) does not impact API, environment
variables, or build options.

There are some incompatibilities, described in the
[Broken Compatibility with Intel MKL-DNN](@ref dg_mtdt_s2) section below.

## Summary of Changes

In short, the migration can be as simple as just replacing all
`MKLDNN/mkldnn` substrings with `DNNL/dnnl`.

### Source Code Changes

All headers, functions, types, and namespaces are renamed by replacing `mkldnn`
with `dnnl`. The macros with `MKLDNN` are replaced with `DNNL` counterparts.

An example of code with Intel MKL-DNN v1.0:
~~~ cpp
#include "mkldnn.hpp"

using namespace mkldnn;

mkldnn_memory_desc_t md;
if (md.format_kind == mkldnn_blocked) {}
conv.exec(stream, {{MKLDNN_ARGS_SRC, src}, ...});
~~~

The updated example with DNNL v1.1:
~~~ cpp
#include "dnnl.hpp"

using namespace dnnl;

dnnl_memory_desc_t md;
if (md.format_kind == dnnl_blocked) {}
conv.exec(stream, {{DNNL_ARGS_SRC, src}, ...});
~~~

To API compatibility with Intel MKL-DNN is based on
``include/mkldnn_dnnl_mangling.h`` header file that maps all Intel MKL-DNN
symbols to DNNL ones using C preprocessor:

~~~ cpp
// ...
#define mkldnn_memory_desc_t           dnnl_memory_desc_t
#define mkldnn_memory_desc_init_by_tag dnnl_memory_desc_init_by_tag
// ...
~~~

This file is included to every former Intel MKL-DNN header files
(for instance, see `mkldnn.h`) along with the DNNL counterpart.

### Build Process

The changes to the build options are similar to the ones in the source code.
All the options and namespaces with `MKLDNN` are replaced with `DNNL`:

| Intel MKL-DNN                 | DNNL                        |
|:------------------------------|:----------------------------|
| MKLDNN (namespace)            | DNNL (namespace)            |
| MKLDNN_ARCH_OPT_FLAGS         | DNNL_ARCH_OPT_FLAGS         |
| MKLDNN_BUILD_EXAMPLES         | DNNL_BUILD_EXAMPLES         |
| MKLDNN_BUILD_FOR_CI           | DNNL_BUILD_FOR_CI           |
| MKLDNN_BUILD_TESTS            | DNNL_BUILD_TESTS            |
| MKLDNN_CPU_RUNTIME            | DNNL_CPU_RUNTIME            |
| MKLDNN_ENABLE_CONCURRENT_EXEC | DNNL_ENABLE_CONCURRENT_EXEC |
| MKLDNN_ENABLE_JIT_PROFILING   | DNNL_ENABLE_JIT_PROFILING   |
| MKLDNN_GPU_BACKEND            | DNNL_GPU_BACKEND            |
| MKLDNN_GPU_RUNTIME            | DNNL_GPU_RUNTIME            |
| MKLDNN_INSTALL_MODE           | DNNL_INSTALL_MODE           |
| MKLDNN_LIBRARY_TYPE           | DNNL_LIBRARY_TYPE           |
| MKLDNN_THREADING              | DNNL_THREADING              |
| MKLDNN_USE_CLANG_SANITIZER    | DNNL_USE_CLANG_SANITIZER    |
| MKLDNN_VERBOSE                | DNNL_VERBOSE                |
| MKLDNN_WERROR                 | DNNL_WERROR                 |

You must switch to DNNL build options as well:

~~~ sh
# Through find package
find_package(dnnl DNNL CONFIG REQUIRED)
target_link_libraries(project_app DNNL::dnnl)

# Or direct sub-project inclusion
add_subdirectory(${DNNL_DIR} DNNL)
include_directories(${DNNL_DIR}/include)
target_link_libraries(project_app dnnl)
~~~

@anchor dg_mtdt_s2
## Broken Compatibility with Intel MKL-DNN

Unfortunately, full compatibility after renaming is not implemented.
DNNL is **not** compatible with Intel MKL-DNN in the following things:
- ABI: An application or a library built with Intel MKL-DNN cannot switch on
  using DNNL without recompiling.
- Microsoft\* Visual Studio Solution files that are generated by cmake will
  be based on DNNL name only
  (e.g. `MKLDNN.sln` becomes `DNNL.sln`, and the former is no more generated).

## Information for Developers

The implementation of renaming (several patches and scripts that rename the
library) can be found
[here](https://github.com/emfomenk/intel-mkldnn-rebranding).
