diff --git a/CMakeLists.txt b/CMakeLists.txt index ec2fe42d2..afff55bc1 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -57,6 +57,7 @@ option(HAVE_STATS "stats enabled by default" ON) option(HAVE_DEBUG_MM "debugging oriented memory management disabled by default" OFF) option(COVERAGE "code coverage" OFF) option(HAVE_RUST "rust bindings not built by default" OFF) +option(HAVE_ITT_INSTRUMENTATION "instrument code with ITT API" OFF) if(HAVE_RUST) option(RUST_VERBOSE_BUILD "pass -vv to cargo compilation" OFF) @@ -165,6 +166,17 @@ if(CHECK_FOUND) endif(NOT CHECK_WORKING) endif(CHECK_FOUND) +if (HAVE_ITT_INSTRUMENTATION) + if(PKG_CONFIG_FOUND) + pkg_check_modules(ITTNOTIFY REQUIRED ittnotify>=1.0) + else() + find_package(ITTNOTIFY REQUIRED 1.0) + endif() + include_directories(${ITTNOTIFY_INCLUDE_DIRS}) + link_directories(${ITTNOTIFY_LIBRARY_DIRS}) + link_libraries(${ITTNOTIFY_LIBRARIES}) +endif(HAVE_ITT_INSTRUMENTATION) + find_package(Threads) diff --git a/cmake/FindITTNOTIFY.cmake b/cmake/FindITTNOTIFY.cmake new file mode 100644 index 000000000..0c1ae6bc5 --- /dev/null +++ b/cmake/FindITTNOTIFY.cmake @@ -0,0 +1,65 @@ +# ITTNOTIFY is the instrumentation and tracing technology (ITT) APIs provided by +# the Intel® VTune™Amplifier enable your application to generate and control +# the collection of trace data during its execution. +# +# The following variables are set when ITTNOTIFY is found: +# ITTNOTIFY_FOUND = Set to true, if all components of ITTNOTIFY have been found. +# ITTNOTIFY_INCLUDE_DIRS = Include path for the header files of ITTNOTIFY. +# ITTNOTIFY_LIBRARY_DIRS = Library search path for the ITTNOTIFY libraries. +# ITTNOTIFY_LIBRARIES = Link these to use ITTNOTIFY. +# ITTNOTIFY_LFLAGS = Linker flags (optional). + +if (NOT ITTNOTIFY_FOUND) + + find_program(VTUNE_EXECUTABLE amplxe-cl) + + if(NOT VTUNE_EXECUTABLE) + set(ITTNOTIFY_FOUND false) + return() + endif() + + get_filename_component(VTUNE_DIR ${VTUNE_EXECUTABLE} PATH) + set(ITTNOTIFY_ROOT_DIR "${VTUNE_DIR}/..") + + ##_____________________________________________________________________________ + ## Check for the header files + + find_path (ITTNOTIFY_INCLUDE_DIRS + NAMES ittnotify.h + HINTS ${ITTNOTIFY_ROOT_DIR} + PATHS /usr /usr/local + PATH_SUFFIXES include + ) + + ##_____________________________________________________________________________ + ## Check for the library + + find_library (ITTNOTIFY_LIBRARIES ittnotify + HINTS ${ITTNOTIFY_ROOT_DIR} + PATHS /usr /usr/local /opt/local + PATH_SUFFIXES lib64 lib + ) + + ##_____________________________________________________________________________ + ## Actions taken when all components have been found + + find_package_handle_standard_args (ITTNOTIFY DEFAULT_MSG ITTNOTIFY_LIBRARIES ITTNOTIFY_INCLUDE_DIRS) + + if (ITTNOTIFY_FOUND) + if (NOT ITTNOTIFY_FIND_QUIETLY) + message (STATUS "Found components for ITTNOTIFY") + message (STATUS "ITTNOTIFY_ROOT_DIR = ${ITTNOTIFY_ROOT_DIR}") + message (STATUS "ITTNOTIFY_INCLUDE_DIRS = ${ITTNOTIFY_INCLUDE_DIRS}") + message (STATUS "ITTNOTIFY_LIBRARIES = ${ITTNOTIFY_LIBRARIES}") + endif (NOT ITTNOTIFY_FIND_QUIETLY) + else (ITTNOTIFY_FOUND) + if (ITTNOTIFY_FIND_REQUIRED) + message (FATAL_ERROR "Could not find ITTNOTIFY!") + endif (ITTNOTIFY_FIND_REQUIRED) + endif (ITTNOTIFY_FOUND) + + if(UNIX) + list(APPEND ITTNOTIFY_LIBRARIES dl) + endif() + +endif (NOT ITTNOTIFY_FOUND) diff --git a/config.h.in b/config.h.in index 5ead881f8..f2fe91ba5 100644 --- a/config.h.in +++ b/config.h.in @@ -19,3 +19,5 @@ #cmakedefine HAVE_STATS #cmakedefine HAVE_DEBUG_MM + +#cmakedefine HAVE_ITT_INSTRUMENTATION diff --git a/include/cc_define.h b/include/cc_define.h index 33a9983ee..6a207036f 100644 --- a/include/cc_define.h +++ b/include/cc_define.h @@ -55,6 +55,10 @@ extern "C" { #define CC_DEBUG_MM 1 #endif +#ifdef HAVE_ITT_INSTRUMENTATION +#define CC_ITT 1 +#endif + #define CC_OK 0 #define CC_ERROR -1 diff --git a/include/cc_itt.h b/include/cc_itt.h new file mode 100644 index 000000000..583c72d93 --- /dev/null +++ b/include/cc_itt.h @@ -0,0 +1,69 @@ +#pragma once + +#include + +#ifdef CC_ITT +#include "ittnotify.h" +#endif + +#ifdef __cplusplus +extern "C" { +#endif +#ifdef CC_ITT + +#define ITT_DOMAIN_NAME "cc_itt" + +#define cc_declare_itt_function(_keyword, _name) \ + _keyword __itt_heap_function _name + +#define cc_create_itt_malloc(_name) \ + _name = __itt_heap_function_create(#_name, ITT_DOMAIN_NAME) + +#define cc_create_itt_free(_name) \ + _name = __itt_heap_function_create(#_name, ITT_DOMAIN_NAME) + +#define cc_create_itt_realloc(_name) \ + _name = __itt_heap_function_create(#_name, ITT_DOMAIN_NAME) + +#define cc_itt_alloc(_itt_heap_f, _p, _s) do { \ + __itt_heap_allocate_begin(_itt_heap_f, (size_t)(_s), 0); \ + __itt_heap_allocate_end(_itt_heap_f, (void *)&(_p), (size_t)(_s), 0); \ +} while (0) + +#define cc_itt_zalloc(_itt_heap_f, _p, _s) do { \ + __itt_heap_allocate_begin(_itt_heap_f, (size_t)(_s), 1); \ + __itt_heap_allocate_end(_itt_heap_f, (void *)&(_p), (size_t)(_s), 1); \ +} while (0) + +#define cc_itt_free(_itt_heap_f, _p) do { \ + __itt_heap_free_begin(_itt_heap_f, _p); \ + __itt_heap_free_end(_itt_heap_f, _p); \ +} while (0) + +#define cc_itt_realloc(_itt_heap_f, _p, _np, _s) do { \ + __itt_heap_reallocate_begin(_itt_heap_f, _p, (size_t)(_s), 0); \ + __itt_heap_reallocate_end(_itt_heap_f, _p, (void *)&(_np), (size_t)(_s), 0); \ +} while (0) + +#define cc_itt_heap_internal_access() \ + __itt_heap_internal_access_begin() + +#define cc_itt_heap_internal_access_end() \ + __itt_heap_internal_access_end() + +#else +#define cc_declare_itt_function(_keyword, _name) +#define cc_create_itt_malloc(_name) +#define cc_create_itt_free(_name) +#define cc_create_itt_realloc(_name) +#define cc_itt_alloc(_itt_heap_f, _p, _s) +#define cc_itt_zalloc(_itt_heap_f, _p, _s) +#define cc_itt_free(_itt_heap_f, _p) +#define cc_itt_realloc(_itt_heap_f, _p, _np, _s) +#define cc_itt_heap_internal_access_begin() +#define cc_itt_heap_internal_access_end() +#endif /* CC_ITT */ + +#ifdef __cplusplus +} +#endif