Add IREE_BUILD_TRACY CMake option. (#7382)
* Off by default for now, and I only expect that this works on Linux.
* If `-DIREE_BUILD_TRACY=ON` then `ninja tracy/all` will build both the headless capture tool and the full GUI (if sufficient deps are installed).
* My intent is, in a next step, to enable a traced runtime Python wheel as an alternative to the normal IREE runtime, and in that, I will include the headless capture tool.
* Add scripts to install deps on manylinux2014 to build Tracy.
* Add console scripts to iree.runtime Python package to bundle iree-tracy-capture and iree-run-module (because why not while here).
* Add an instrumented runtime package variant to the release pipeline.
diff --git a/.github/workflows/build_package.yml b/.github/workflows/build_package.yml
index 1d4998e..56bcd4a 100644
--- a/.github/workflows/build_package.yml
+++ b/.github/workflows/build_package.yml
@@ -42,6 +42,9 @@
build_package: py-runtime-pkg
experimental: false
- os: ubuntu-18.04
+ build_package: instrumented-py-runtime-pkg
+ experimental: true
+ - os: ubuntu-18.04
build_package: py-xla-compiler-tools-pkg
experimental: false
- os: ubuntu-18.04
@@ -122,7 +125,8 @@
run: |
python -m pip install cibuildwheel==1.7.2
- - name: Write version info
+ - name: Write version info (release)
+ if: "!startsWith(matrix.build_package, 'instrumented-')"
shell: bash
run: |
cat << EOF > ./main_checkout/version_info.json
@@ -134,6 +138,19 @@
EOF
cat ./main_checkout/version_info.json
+ - name: Write version info (instrumented)
+ if: "startsWith(matrix.build_package, 'instrumented-')"
+ shell: bash
+ run: |
+ cat << EOF > ./main_checkout/version_info.json
+ {
+ "package-suffix": "-instrumented${{ github.event.inputs.package_suffix }}",
+ "package-version": "${{ github.event.inputs.package_version }}",
+ "iree-revision": "$(cd ./main_checkout && git rev-parse HEAD)"
+ }
+ EOF
+ cat ./main_checkout/version_info.json
+
# The main distribution consists of the project being built, installed
# and archived. We have to split it per operating system, and Linux
# is special because we build under a manylinux container which gives
@@ -167,6 +184,18 @@
mkdir -p $package_dir && touch $package_dir/setup.py
python -m cibuildwheel --output-dir bindist $package_dir
+ - name: Build runtime wheels (instrumented)
+ if: "matrix.build_package == 'instrumented-py-runtime-pkg'"
+ shell: bash
+ run: |
+ package_dir="./iree-install/python_packages/iree_runtime"
+ export CIBW_BEFORE_ALL_LINUX="./main_checkout/build_tools/github_actions/install_tracy_cli_deps_manylinux2014.sh"
+ export CIBW_BEFORE_BUILD="python ./main_checkout/build_tools/github_actions/build_dist.py py-runtime-pkg"
+ # TODO: cibuildwheel sanity checks this, but our setup.py is the
+ # *output* of the build :( Make source packages.
+ mkdir -p $package_dir && touch $package_dir/setup.py
+ python -m cibuildwheel --output-dir bindist $package_dir
+
# Experimental iree.compiler package.
- name: Build compiler wheels
if: "matrix.build_package == 'py-compiler-pkg'"
diff --git a/CMakeLists.txt b/CMakeLists.txt
index 6205283..77fd81d 100644
--- a/CMakeLists.txt
+++ b/CMakeLists.txt
@@ -43,6 +43,7 @@
option(IREE_BUILD_BENCHMARKS "Builds IREE benchmark suites." OFF)
option(IREE_BUILD_DOCS "Builds IREE docs." OFF)
option(IREE_BUILD_SAMPLES "Builds IREE sample projects." ON)
+option(IREE_BUILD_TRACY "Builds tracy server tools." OFF)
option(IREE_BUILD_TENSORFLOW_ALL "Builds all TensorFlow compiler frontends." OFF)
option(IREE_BUILD_TENSORFLOW_COMPILER "Builds TensorFlow compiler frontend." OFF)
@@ -516,8 +517,18 @@
add_subdirectory(iree/tools)
+if(IREE_BUILD_TRACY)
+ if(NOT LINUX)
+ message(WARNING "Building Tracy (IREE_BUILD_TRACY) on non-Linux is unsupported and may fail below.")
+ endif()
+ add_subdirectory(build_tools/third_party/tracy ${CMAKE_CURRENT_BINARY_DIR}/tracy)
+ if(NOT TARGET IREETracyCaptureServer)
+ message(SEND_ERROR "Could not build Tracy. Either unset IREE_BUILD_TRACY or look for missing dependencies above and install them.")
+ endif()
+endif()
+
# Order constraint: The python bindings install tools targets from iree/tools
-# and must come after it.
+# and tracy, and must come after it.
if(${IREE_BUILD_PYTHON_BINDINGS})
add_subdirectory(bindings/python)
endif()
diff --git a/bindings/python/iree/runtime/CMakeLists.txt b/bindings/python/iree/runtime/CMakeLists.txt
index dccdf00..1e1a11e 100644
--- a/bindings/python/iree/runtime/CMakeLists.txt
+++ b/bindings/python/iree/runtime/CMakeLists.txt
@@ -4,6 +4,17 @@
# See https://llvm.org/LICENSE.txt for license information.
# SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
+set(_python_extra_srcs)
+set(_extra_install_tool_targets)
+set(_tracy_enabled OFF)
+
+if(TARGET IREETracyCaptureServer)
+ message(STATUS "Bundline Tracy CLI tools with Python API")
+ set(_tracy_enabled ON)
+ list(APPEND _python_extra_srcs "scripts/iree-tracy-capture")
+ list(APPEND _extra_install_tool_targets "IREETracyCaptureServer")
+endif()
+
################################################################################
# Package
################################################################################
@@ -43,6 +54,8 @@
"tracing.py"
"scripts/iree_benchmark_trace/__main__.py"
"scripts/iree_run_trace/__main__.py"
+ "scripts/iree_run_module/__main__.py"
+ ${_python_extra_srcs}
PYEXT_DEPS
::PyExtRt
)
@@ -59,6 +72,20 @@
TO_EXE_NAME iree-run-trace
)
+iree_symlink_tool(
+ TARGET runtime
+ FROM_TOOL_TARGET iree_tools_iree-run-module
+ TO_EXE_NAME iree-run-module
+)
+
+if(_tracy_enabled)
+ iree_symlink_tool(
+ TARGET runtime
+ FROM_TOOL_TARGET IREETracyCaptureServer
+ TO_EXE_NAME iree-tracy-capture
+ )
+endif()
+
################################################################################
# Tests
################################################################################
@@ -102,7 +129,9 @@
DEPS
bindings_python_iree_runtime_PyExtRt
iree_tools_iree-benchmark-trace
+ iree_tools_iree-run-module
iree_tools_iree-run-trace
+ ${_extra_install_tool_targets}
ADDL_PACKAGE_FILES
${CMAKE_CURRENT_SOURCE_DIR}/README.md
)
@@ -116,7 +145,9 @@
install(
TARGETS
iree_tools_iree-benchmark-trace
+ iree_tools_iree-run-module
iree_tools_iree-run-trace
+ ${_extra_install_tool_targets}
DESTINATION "${PY_INSTALL_MODULE_DIR}"
COMPONENT "${PY_INSTALL_COMPONENT}"
)
diff --git a/bindings/python/iree/runtime/scripts/iree_run_module/__main__.py b/bindings/python/iree/runtime/scripts/iree_run_module/__main__.py
new file mode 100644
index 0000000..a5509a3
--- /dev/null
+++ b/bindings/python/iree/runtime/scripts/iree_run_module/__main__.py
@@ -0,0 +1,20 @@
+# Copyright 2021 The IREE Authors
+#
+# Licensed under the Apache License v2.0 with LLVM Exceptions.
+# See https://llvm.org/LICENSE.txt for license information.
+# SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
+
+import os
+import subprocess
+import sys
+
+
+def main(args=None):
+ if args is None:
+ args = sys.argv[1:]
+ exe = os.path.join(os.path.dirname(__file__), "..", "..", "iree-run-module")
+ return subprocess.call(args=[exe] + args)
+
+
+if __name__ == "__main__":
+ sys.exit(main())
diff --git a/bindings/python/iree/runtime/scripts/iree_tracy_capture/__main__.py b/bindings/python/iree/runtime/scripts/iree_tracy_capture/__main__.py
new file mode 100644
index 0000000..58f2118
--- /dev/null
+++ b/bindings/python/iree/runtime/scripts/iree_tracy_capture/__main__.py
@@ -0,0 +1,21 @@
+# Copyright 2021 The IREE Authors
+#
+# Licensed under the Apache License v2.0 with LLVM Exceptions.
+# See https://llvm.org/LICENSE.txt for license information.
+# SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
+
+import os
+import subprocess
+import sys
+
+
+def main(args=None):
+ if args is None:
+ args = sys.argv[1:]
+ exe = os.path.join(os.path.dirname(__file__), "..", "..",
+ "iree-tracy-capture")
+ return subprocess.call(args=[exe] + args)
+
+
+if __name__ == "__main__":
+ sys.exit(main())
diff --git a/bindings/python/iree/runtime/setup.py.in b/bindings/python/iree/runtime/setup.py.in
index dc25a35..2d0cfac 100644
--- a/bindings/python/iree/runtime/setup.py.in
+++ b/bindings/python/iree/runtime/setup.py.in
@@ -41,14 +41,18 @@
package_data={
"": [
f"*{sysconfig.get_config_var('EXT_SUFFIX')}",
+ "iree-run-module*",
"iree-run-trace*",
"iree-benchmark-trace*",
+ "iree-tracy-capture*",
],
},
entry_points={
"console_scripts": [
+ "iree-run-module = iree.runtime.scripts.iree_run_module.__main__:main",
"iree-run-trace = iree.runtime.scripts.iree_run_trace.__main__:main",
"iree-benchmark-trace = iree.runtime.scripts.iree_benchmark_trace.__main__:main",
+ "iree-tracy-capture = iree.runtime.scripts.iree_tracy_capture.__main__:main",
],
},
zip_safe=False,
diff --git a/build_tools/github_actions/build_dist.py b/build_tools/github_actions/build_dist.py
index 00fb326..f9e9545 100644
--- a/build_tools/github_actions/build_dist.py
+++ b/build_tools/github_actions/build_dist.py
@@ -210,17 +210,30 @@
check=True)
-def build_py_runtime_pkg():
+def build_py_runtime_pkg(instrumented: bool = False):
"""Builds the iree-install/python_packages/iree_runtime package.
This includes native, python-version dependent code and is designed to
be built multiple times.
+
+ Note that an instrumented build may require additional dependencies.
+ See: install_tracy_cli_deps_manylinux2014.sh for how to set up on that
+ container.
"""
install_python_requirements()
# Clean up install and build trees.
shutil.rmtree(INSTALL_DIR, ignore_errors=True)
remove_cmake_cache()
+ extra_cmake_flags = []
+
+ # Extra options for instrumentation.
+ if instrumented:
+ print("*** Enabling options for instrumented build ***")
+ extra_cmake_flags.extend([
+ f"-DIREE_ENABLE_RUNTIME_TRACING=ON",
+ f"-DIREE_BUILD_TRACY=ON",
+ ])
# CMake configure.
print("*** Configuring ***")
@@ -234,7 +247,7 @@
f"-DIREE_BUILD_PYTHON_BINDINGS=ON",
f"-DIREE_BUILD_SAMPLES=OFF",
f"-DIREE_BUILD_TESTS=OFF",
- ],
+ ] + extra_cmake_flags,
check=True)
print("*** Building ***")
@@ -405,6 +418,8 @@
build_main_dist()
elif command == "py-runtime-pkg":
build_py_runtime_pkg()
+elif command == "instrumented-py-runtime-pkg":
+ build_py_runtime_pkg(instrumented=True)
elif command == "py-pure-pkgs":
build_py_pure_pkgs()
elif command == "py-xla-compiler-tools-pkg":
diff --git a/build_tools/github_actions/install_tbb_manylinux2014.sh b/build_tools/github_actions/install_tbb_manylinux2014.sh
new file mode 100755
index 0000000..7c8e9b1
--- /dev/null
+++ b/build_tools/github_actions/install_tbb_manylinux2014.sh
@@ -0,0 +1,50 @@
+#!/bin/bash
+# Copyright 2021 The IREE Authors
+#
+# Licensed under the Apache License v2.0 with LLVM Exceptions.
+# See https://llvm.org/LICENSE.txt for license information.
+# SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
+# The version of tbb installed on manylinux2014 is too old to support the
+# parallel STL libraries on the installed GCC9-based toolchain. Further,
+# Intel *broke* compatibility starting in 2021 for GCC<=10.
+# To make matters worse, the prior 2020 versions did not have cmake or
+# install support.
+# Shame on you Intel.
+# See: https://community.intel.com/t5/Intel-oneAPI-Threading-Building/tbb-task-has-not-been-declared/m-p/1254418
+# Since this is unlikely to be helpful outside of the old centos systems
+# that manylinux2014 is based on (newer ones are based on Debian),
+# we just tailor this specifically for docker images of that distro.
+
+# You can test this with either an official manylinux2014 docker image or
+# our special one (which is really only special in that it includes bazel):
+# docker run --rm -it -v $(pwd):/work stellaraccident/manylinux2014_x86_64-bazel-3.7.2:latest /bin/bash
+
+set -e
+
+mkdir -p /tmp/libtbb_build
+cd /tmp/libtbb_build
+curl -o tbbsrc.tgz -L https://github.com/oneapi-src/oneTBB/archive/refs/tags/v2020.3.tar.gz
+tar xzf tbbsrc.tgz
+cd oneTBB-*/
+
+echo "****** BUILDING TBB ******"
+make -j$(nproc)
+cp -R include/* /usr/include
+cp build/*_release/* /usr/lib64
+echo "prefix=/usr
+exec_prefix=${prefix}
+libdir=${exec_prefix}/lib64
+includedir=${prefix}/include
+
+Name: Threading Building Blocks
+Description: Intel's parallelism library for C++
+URL: http://www.threadingbuildingblocks.org/
+Version:
+Libs: -ltbb
+Cflags:
+" > /usr/lib64/pkgconfig/tbb.pc
+
+echo "****** DONE BUILDING TBB ******"
+
+cd /
+rm -Rf /tmp/libtbb_build
diff --git a/build_tools/github_actions/install_tracy_cli_deps_manylinux2014.sh b/build_tools/github_actions/install_tracy_cli_deps_manylinux2014.sh
new file mode 100755
index 0000000..2eda736
--- /dev/null
+++ b/build_tools/github_actions/install_tracy_cli_deps_manylinux2014.sh
@@ -0,0 +1,14 @@
+#!/bin/bash
+# Copyright 2021 The IREE Authors
+#
+# Licensed under the Apache License v2.0 with LLVM Exceptions.
+# See https://llvm.org/LICENSE.txt for license information.
+# SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
+# Installs deps on a manylinux2014 CentOS docker container needed for
+# building Tracy CLI capture tool.
+
+set -e
+
+td="$(cd $(dirname $0) && pwd)"
+yum -y install capstone-devel libzstd-devel
+$td/install_tbb_manylinux2014.sh
diff --git a/build_tools/third_party/tracy/CMakeLists.txt b/build_tools/third_party/tracy/CMakeLists.txt
new file mode 100644
index 0000000..7c1e43d
--- /dev/null
+++ b/build_tools/third_party/tracy/CMakeLists.txt
@@ -0,0 +1,183 @@
+# Copyright 2021 The IREE Authors
+#
+# Licensed under the Apache License v2.0 with LLVM Exceptions.
+# See https://llvm.org/LICENSE.txt for license information.
+# SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
+
+cmake_minimum_required(VERSION 3.16.3)
+
+project(IREETracyServer C CXX)
+
+set(TRACY_SOURCE_DIR "${CMAKE_CURRENT_SOURCE_DIR}/../../../third_party/tracy")
+
+find_package(Threads REQUIRED)
+
+#-------------------------------------------------------------------------------
+# Detect package manager
+#-------------------------------------------------------------------------------
+
+message(STATUS "Checking for Tracy dependencies...")
+find_program(PKGCONFIG pkg-config)
+if(NOT PKGCONFIG)
+ message(STATUS "Could not find pkg-config (on Ubuntu/Debian, 'apt install pkg-config')")
+else()
+ include(FindPkgConfig)
+ pkg_check_modules(TRACY_DEPS
+ capstone
+ tbb
+ libzstd
+ )
+ pkg_check_modules(TRACY_GTK_DEPS
+ freetype2
+ glfw3
+ gtk+-3.0
+ )
+endif()
+
+if(NOT TRACY_DEPS_FOUND)
+ message(STATUS "Could not find Tracy dependencies (Tracy server will not be built).")
+ message(STATUS "To build Tracy, install packages capstone, and tbb (on Ubuntu/Debian, 'apt install libcapstone-dev libtbb-dev libzstd-dev')")
+ return()
+endif()
+
+if(NOT TRACY_GTK_DEPS_FOUND)
+ message(STATUS
+ "Could not find deps required to build graphical programs: "
+ "Tracy graphical profiler will not be built (on Ubuntu/Debian, 'apt install libglfw3-dev libfreetype-dev libgtk-3-dev')")
+endif()
+
+#-------------------------------------------------------------------------------
+# Configuration
+#-------------------------------------------------------------------------------
+
+function(setup_cxx_options name)
+ set_target_properties(${name}
+ PROPERTIES
+ CXX_STANDARD 17
+ )
+ target_compile_options(${name}
+ PRIVATE
+ $<$<CXX_COMPILER_ID:GNU,Clang>:-Wno-unused-result>
+ )
+ target_include_directories(${name}
+ PUBLIC
+ ${TRACY_SOURCE_DIR}/imgui
+ ${TRACY_DEPS_INCLUDE_DIRS}
+ )
+ target_link_libraries(${name}
+ PRIVATE
+ ${TRACY_DEPS_LIBRARIES}
+ ${CMAKE_DL_LIBS}
+ ${CMAKE_THREAD_LIBS_INIT}
+ )
+endfunction()
+
+function(setup_graphics_deps name)
+ target_compile_definitions(${name}
+ PRIVATE
+ DISPLAY_SERVER_X11
+ )
+ target_include_directories(${name}
+ PUBLIC
+ ${TRACY_GTK_DEPS_INCLUDE_DIRS}
+ )
+ target_link_libraries(${name}
+ PRIVATE
+ ${TRACY_GTK_DEPS_LIBRARIES}
+ )
+endfunction()
+
+#-------------------------------------------------------------------------------
+# Common library
+#-------------------------------------------------------------------------------
+
+file(GLOB COMMON_SRCS ${TRACY_SOURCE_DIR}/common/*.cpp)
+add_library(IREETracyCommon
+ ${COMMON_SRCS}
+)
+setup_cxx_options(IREETracyCommon)
+
+#-------------------------------------------------------------------------------
+# Server library
+#-------------------------------------------------------------------------------
+
+file(GLOB SERVER_SRCS ${TRACY_SOURCE_DIR}/server/*.cpp)
+add_library(IREETracyServer
+ ${SERVER_SRCS}
+)
+setup_cxx_options(IREETracyServer)
+target_link_libraries(IREETracyServer
+ PRIVATE
+ IREETracyCommon
+)
+
+#-------------------------------------------------------------------------------
+# IMGUI library
+#-------------------------------------------------------------------------------
+
+file(GLOB IMGUI_SOURCES ${TRACY_SOURCE_DIR}/imgui/*.cpp)
+add_library(IREETracyIMGUI
+ ${IMGUI_SOURCES}
+)
+setup_cxx_options(IREETracyServer)
+
+#-------------------------------------------------------------------------------
+# Standalone capture server
+#-------------------------------------------------------------------------------
+
+add_executable(IREETracyCaptureServer
+ ${TRACY_SOURCE_DIR}/capture/src/capture.cpp
+)
+set_target_properties(IREETracyCaptureServer
+ PROPERTIES
+ OUTPUT_NAME "iree-tracy-capture"
+)
+setup_cxx_options(IREETracyCaptureServer)
+target_link_libraries(IREETracyCaptureServer
+ PRIVATE
+ IREETracyCommon
+ IREETracyServer
+)
+
+#-------------------------------------------------------------------------------
+# Graphical frontends
+#-------------------------------------------------------------------------------
+
+if(TRACY_GTK_DEPS_FOUND)
+ #-----------------------------------------------------------------------------
+ # NFD library
+ #-----------------------------------------------------------------------------
+
+ set(NFD_SOURCES
+ ${TRACY_SOURCE_DIR}/nfd/nfd_common.c
+ ${TRACY_SOURCE_DIR}/nfd/nfd_gtk.c
+ )
+ add_library(IREETracyNFD
+ ${NFD_SOURCES}
+ )
+ setup_cxx_options(IREETracyNFD)
+ setup_graphics_deps(IREETracyNFD)
+
+ #-----------------------------------------------------------------------------
+ # Profiler
+ #-----------------------------------------------------------------------------
+
+ file(GLOB PROFILER_SRCS ${TRACY_SOURCE_DIR}/profiler/src/*.cpp)
+ add_executable(IREETracyProfiler
+ ${PROFILER_SRCS}
+ )
+ set_target_properties(IREETracyProfiler
+ PROPERTIES
+ OUTPUT_NAME "iree-tracy-profiler"
+ )
+ setup_cxx_options(IREETracyProfiler)
+ setup_graphics_deps(IREETracyProfiler)
+ target_link_libraries(IREETracyProfiler
+ PRIVATE
+ IREETracyIMGUI
+ IREETracyCommon
+ IREETracyNFD
+ IREETracyServer
+ ${CMAKE_THREAD_LIBS_INIT}
+ )
+endif()