Skip to content

Commit b51512a

Browse files
zma2mschilling0
andauthored
Initial commits of unitrace (#17)
* Initial version of unitrace * Initial commits of unitrace * Initial commits of unitrace * Initial commits of unitrace * Initial commits of unitrace * Initial commits of unitrace * Initial commits of unitrace * Initial commits of unitrace * Initial commits of unitrace * Initial commits of unitrace * Initial commits of unitrace * Initial commits of unitrace * Unhide Symbols Required By XPTI * Initial commits of unitrace * Initial commits of unitrace --------- Co-authored-by: Schilling, Matthew <[email protected]>
1 parent 7f4923f commit b51512a

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

61 files changed

+22717
-16
lines changed

.github/workflows/sdk_build_and_test.yml

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -70,7 +70,12 @@ jobs:
7070
- name: Checkout
7171
uses: actions/checkout@v4
7272

73+
- name: Build-and-test-unitrace
74+
run: |
75+
python ./tests/run.py -s unitrace
76+
7377
- name: Build-and-test-onetrace
78+
if: always()
7479
run: |
7580
python ./tests/run.py -s onetrace
7681

README.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -51,6 +51,7 @@ You may obtain a copy of the License at https://opensource.org/licenses/MIT
5151
- for [oneAPI Level Zero (Level Zero)](chapters/system_management/LevelZero.md)
5252

5353
## Profiling & Debug Tools
54+
- [unitrace](tools/unitrace) - unified tracing and profiling tool. In addition to Level Zero and/or OpenCL, this tool is capable of profiling software layers in the software stack, for example, SYCL and plugins, oneCCL, MPI etc., for scale-up and scale-out applications. It also supports profiling hardware metrics (including instruction-level EU stalls) and software events at the same time.
5455
- [onetrace](tools/onetrace) - host and device tracing tool for OpenCL(TM) and Level Zero backends with support of DPC++ (both for CPU and GPU) and OpenMP* GPU offload;
5556
- [oneprof](tools/oneprof) - GPU HW metrics collection tool for OpenCL(TM) and Level Zero backends with support of DPC++ and OpenMP* GPU offload;
5657
- [ze_tracer](tools/ze_tracer) - "Swiss army knife" for Level Zero API call tracing and profiling (former ze_intercept);

tests/run.py

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -34,6 +34,13 @@
3434

3535
tools = [["gpuinfo", "-l", "-i", "-m"],
3636
["sysmon", "-p", "-l", "-d"],
37+
["unitrace",
38+
"-c", "-h", "-d", "-t", "-s",
39+
"--chrome-call-logging",
40+
"--chrome-device-logging",
41+
"--chrome-kernel-logging",
42+
"--chrome-sycl-logging",
43+
"--conditional-collection"],
3744
["onetrace",
3845
"-c", "-h", "-d", "-v", "-t", "-s",
3946
"--demangle",
@@ -177,4 +184,4 @@ def main():
177184
return 1
178185

179186
if __name__ == "__main__":
180-
sys.exit( main() )
187+
sys.exit( main() )

tests/tools/unitrace.py

Lines changed: 84 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,84 @@
1+
import importlib
2+
import os
3+
import subprocess
4+
import sys
5+
6+
import utils
7+
8+
def config(path):
9+
cmake = ["cmake",\
10+
"-DBUILD_WITH_MPI=0", "-DCMAKE_BUILD_TYPE=" + utils.get_build_flag(), ".."]
11+
stdout, stderr = utils.run_process(cmake, path)
12+
if stderr and stderr.find("CMake Error") != -1:
13+
return stderr
14+
return None
15+
16+
def build(path):
17+
stdout, stderr = utils.run_process(["make"], path)
18+
if stderr and stderr.lower().find("error") != -1:
19+
return stderr
20+
return None
21+
22+
samples = [["cl_gemm", "gpu"],
23+
["ze_gemm", None],
24+
["omp_gemm", "gpu"],
25+
["dpc_gemm", "gpu"]]
26+
27+
def run(path, tooloption, app, option):
28+
app_folder = utils.get_sample_executable_path(app)
29+
app_file = os.path.join(app_folder, app)
30+
if (option != None):
31+
command = ["./unitrace", "--opencl", tooloption, app_file, option, "1024", "1"]
32+
else:
33+
command = ["./unitrace", "--opencl", tooloption, app_file, "1024", "1"]
34+
stdout, stderr = utils.run_process(command, path)
35+
if not stdout:
36+
return "stdout is empty"
37+
38+
if (tooloption == "-t"):
39+
if not stderr:
40+
return "stderr is empty"
41+
42+
occurrences = stderr.count("(end)\n")
43+
expected = 0
44+
if (app == "dpc_gemm"):
45+
expected = 7
46+
elif (app == "ze_gemm"):
47+
expected = 6
48+
elif (app == "cl_gemm"):
49+
expected = 4
50+
elif (app == "omp_gemm"):
51+
expected = 16
52+
53+
if (occurrences != expected):
54+
log = " (" + app + " " + option + " " + str(occurrences) + " captured but " + str(expected) + " expected) "
55+
sys.stdout.write(log)
56+
return log
57+
58+
return None
59+
60+
def main(tooloption):
61+
path = utils.get_tool_build_path("unitrace")
62+
log = config(path)
63+
if log:
64+
return log
65+
log = build(path)
66+
if log:
67+
return log
68+
69+
for sample in samples:
70+
for i in range(1, len(sample)):
71+
module = importlib.import_module("samples." + sample[0])
72+
module.main(sample[i])
73+
runlog = run(path, tooloption, sample[0], sample[i])
74+
if runlog:
75+
log = runlog
76+
77+
if log:
78+
return log
79+
80+
if __name__ == "__main__":
81+
if len(sys.argv) > 1:
82+
log = main(sys.argv[1])
83+
if log:
84+
print(log)

tests/utils.py

Lines changed: 3 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -60,11 +60,7 @@ def add_env(env, name, val):
6060
def run_process(command, path, environ = None):
6161
shell = True if sys.platform == 'win32' else False
6262
p = subprocess.Popen(command, cwd = path, shell = shell,\
63-
env = environ, stdout = subprocess.PIPE, stderr = subprocess.PIPE)
63+
env = environ, stdout = subprocess.PIPE, stderr = subprocess.PIPE, encoding = "latin-1", text = True)
6464
stdout, stderr = p.communicate()
65-
if sys.version_info.major > 2:
66-
if stderr:
67-
stderr = str(stderr, "utf-8")
68-
if stdout:
69-
stdout = str(stdout, "utf-8")
70-
return stdout, stderr
65+
66+
return stdout, stderr

tools/unitrace/CMakeLists.txt

Lines changed: 164 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,164 @@
1+
include("../../build_utils/CMakeLists.txt")
2+
SetRequiredCMakeVersion()
3+
cmake_minimum_required(VERSION ${REQUIRED_CMAKE_VERSION})
4+
5+
project(PTI_Tools_UniTrace C CXX)
6+
list(APPEND CMAKE_MODULE_PATH ${PROJECT_SOURCE_DIR}/cmake)
7+
SetCompilerFlags()
8+
SetBuildType()
9+
10+
option(BUILD_WITH_MPI
11+
"Build with support for MPI tracing"
12+
ON
13+
)
14+
15+
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++17")
16+
17+
# Tool Library
18+
macro(FindHeadersPath TARGET L0_GEN_SCRIPT GEN_FILE_NAME custom_target)
19+
RequirePythonInterp()
20+
find_path(L0_INC_PATH
21+
NAMES level_zero
22+
PATHS ENV CPATH)
23+
if (NOT L0_INC_PATH)
24+
message(FATAL_ERROR
25+
"Level Zero headers path is not found.\n"
26+
"You may need to install oneAPI Level Zero Driver to fix this issue.")
27+
else()
28+
message(STATUS "Level Zero headers are found at ${L0_INC_PATH}")
29+
endif()
30+
31+
set(L0_GEN_INC_PATH "${CMAKE_BINARY_DIR}")
32+
add_custom_target(${custom_target} ALL
33+
DEPENDS ${L0_GEN_INC_PATH}/${GEN_FILE_NAME})
34+
add_custom_command(OUTPUT ${L0_GEN_INC_PATH}/${GEN_FILE_NAME}
35+
COMMAND "${PYTHON_EXECUTABLE}" ${L0_GEN_SCRIPT} ${L0_GEN_INC_PATH} "${L0_INC_PATH}/level_zero")
36+
target_include_directories(${TARGET}
37+
PUBLIC "${L0_GEN_INC_PATH}")
38+
add_dependencies(${TARGET}
39+
${custom_target})
40+
endmacro()
41+
42+
# Get Git Commit Hash
43+
macro(GetGitCommitHash TARGET GET_COMMIT_HASH_SCRIPT COMMIT_HASH_FILE_NAME target)
44+
RequirePythonInterp()
45+
46+
add_custom_target(${target} ALL DEPENDS ${CMAKE_BINARY_DIR}/${COMMIT_HASH_FILE_NAME})
47+
add_custom_command(OUTPUT ${CMAKE_BINARY_DIR}/${COMMIT_HASH_FILE_NAME}
48+
COMMAND "${PYTHON_EXECUTABLE}" ${GET_COMMIT_HASH_SCRIPT} ${CMAKE_BINARY_DIR} ${COMMIT_HASH_FILE_NAME})
49+
add_dependencies(${TARGET} ${target})
50+
endmacro()
51+
52+
# Download itt source from github repo
53+
set(ITT_HASH 47467459a7984988ab838b5108c03ab1cf0a3f73)
54+
execute_process(COMMAND python3 ${PROJECT_SOURCE_DIR}/scripts/get_itt.py ${CMAKE_BINARY_DIR} ${CMAKE_BINARY_DIR} ${ITT_HASH})
55+
56+
add_subdirectory(${CMAKE_BINARY_DIR}/ittapi)
57+
if (BUILD_WITH_MPI)
58+
find_package(MPI REQUIRED)
59+
add_library(unitrace_mpi SHARED
60+
"${PROJECT_SOURCE_DIR}/src/mpi/mpi.c")
61+
add_dependencies(unitrace_mpi ittnotify)
62+
63+
target_link_libraries(unitrace_mpi
64+
PUBLIC MPI::MPI_C
65+
PRIVATE ${CMAKE_BINARY_DIR}/bin/libittnotify.a)
66+
target_include_directories(unitrace_mpi
67+
PRIVATE "${PROJECT_SOURCE_DIR}"
68+
PRIVATE "${I_MPI_ROOT}/include"
69+
PRIVATE "${PROJECT_SOURCE_DIR}/src"
70+
PRIVATE "${PROJECT_SOURCE_DIR}/../utils"
71+
PRIVATE "${PROJECT_SOURCE_DIR}/../../utils"
72+
PRIVATE "${PROJECT_SOURCE_DIR}/src/itt"
73+
PRIVATE "${CMAKE_BINARY_DIR}/ittheaders"
74+
PRIVATE "${PROJECT_SOURCE_DIR}/src/mpi"
75+
PRIVATE "${PROJECT_SOURCE_DIR}/src/opencl"
76+
PRIVATE "${PROJECT_SOURCE_DIR}/src/levelzero")
77+
if(CMAKE_INCLUDE_PATH)
78+
target_include_directories(unitrace_mpi
79+
PUBLIC "${CMAKE_INCLUDE_PATH}")
80+
endif()
81+
endif()
82+
83+
add_library(unitrace_tool SHARED
84+
"${PROJECT_SOURCE_DIR}/src/opencl/cl_ext_collector.cc"
85+
"${PROJECT_SOURCE_DIR}/../utils/correlator.cc"
86+
"${PROJECT_SOURCE_DIR}/../../utils/trace_guard.cc"
87+
"${PROJECT_SOURCE_DIR}/src/tracer.cc")
88+
link_directories(${ONEAPI_COMPILER_HOME}/lib)
89+
find_package(Xptifw REQUIRED)
90+
target_link_libraries(unitrace_tool PRIVATE Xptifw::Xptifw)
91+
target_include_directories(unitrace_tool
92+
PRIVATE "${PROJECT_SOURCE_DIR}"
93+
PRIVATE "${ONEAPI_COMPILER_HOME}/include"
94+
PRIVATE "${PROJECT_SOURCE_DIR}/src"
95+
PRIVATE "${PROJECT_SOURCE_DIR}/../utils"
96+
PRIVATE "${PROJECT_SOURCE_DIR}/../../utils"
97+
PRIVATE "${PROJECT_SOURCE_DIR}/src/xpti"
98+
PRIVATE "${PROJECT_SOURCE_DIR}/src/itt"
99+
PRIVATE "${CMAKE_BINARY_DIR}/ittheaders"
100+
PRIVATE "${PROJECT_SOURCE_DIR}/src/opencl"
101+
PRIVATE "${PROJECT_SOURCE_DIR}/src/levelzero")
102+
target_compile_definitions(unitrace_tool PUBLIC PTI_LEVEL_ZERO=1)
103+
if(CMAKE_INCLUDE_PATH)
104+
target_include_directories(unitrace_tool
105+
PUBLIC "${CMAKE_INCLUDE_PATH}")
106+
endif()
107+
108+
FindOpenCLLibrary(unitrace_tool)
109+
FindOpenCLHeaders(unitrace_tool)
110+
111+
GetOpenCLTracingHeaders(unitrace_tool)
112+
113+
FindL0Library(unitrace_tool)
114+
FindL0Headers(unitrace_tool)
115+
116+
FindHeadersPath(unitrace_tool "${PROJECT_SOURCE_DIR}/scripts/gen_tracing_common_header.py" "common_header.gen" gen_common_header)
117+
FindHeadersPath(unitrace_tool "${PROJECT_SOURCE_DIR}/scripts/gen_tracing_callbacks.py" "tracing.gen" gen_tracing_header)
118+
119+
120+
target_include_directories(unitrace_tool PRIVATE "${L0_INC_PATH}")
121+
122+
# Loader
123+
124+
add_executable(unitrace "${PROJECT_SOURCE_DIR}/src/unitrace.cc")
125+
set(_use_mpi 1)
126+
127+
if (BUILD_WITH_MPI)
128+
set(_use_mpi 1)
129+
else()
130+
set(_use_mpi 0)
131+
endif()
132+
target_compile_definitions(unitrace PRIVATE BUILD_WITH_MPI=${_use_mpi})
133+
target_include_directories(unitrace
134+
PRIVATE "${CMAKE_BINARY_DIR}"
135+
PRIVATE "${PROJECT_SOURCE_DIR}/src"
136+
PRIVATE "${PROJECT_SOURCE_DIR}/src/levelzero"
137+
PRIVATE "${PROJECT_SOURCE_DIR}/../utils"
138+
PRIVATE "${PROJECT_SOURCE_DIR}/../../utils")
139+
if(UNIX)
140+
target_link_libraries(unitrace pthread dl)
141+
endif()
142+
FindL0Library(unitrace)
143+
FindL0Headers(unitrace)
144+
GetGitCommitHash(unitrace "${PROJECT_SOURCE_DIR}/scripts/get_commit_hash.py" "unitrace_commit_hash.h" get_git_commit_hash_unitrace)
145+
GetGitCommitHash(unitrace_tool "${PROJECT_SOURCE_DIR}/scripts/get_commit_hash.py" "unitrace_tool_commit_hash.h" get_git_commit_hash_unitrace_tool)
146+
147+
add_custom_command(TARGET unitrace POST_BUILD COMMAND "rm" "-rf" "unitrace_commit_hash.h")
148+
add_custom_command(TARGET unitrace_tool POST_BUILD COMMAND "rm" "-rf" "unitrace_tool_commit_hash.h")
149+
150+
# Clearning files only for release build, for any other build types lets skip deletion for better debuggability
151+
string(TOLOWER "${CMAKE_BUILD_TYPE}" LOWER_CMAKE_BUILD_TYPE)
152+
if(NOT LOWER_CMAKE_BUILD_TYPE STREQUAL "debug")
153+
add_custom_command(TARGET unitrace_tool POST_BUILD COMMAND "rm" "-rf" "tracing.gen")
154+
add_custom_command(TARGET unitrace_tool POST_BUILD COMMAND "rm" "-rf" "common_header.gen")
155+
endif()
156+
157+
configure_file(${PROJECT_SOURCE_DIR}/scripts/mergetrace.py mergetrace.py COPYONLY)
158+
159+
# Installation
160+
161+
install(TARGETS unitrace unitrace_tool DESTINATION bin)
162+
if (BUILD_WITH_MPI)
163+
install(TARGETS unitrace_mpi DESTINATION bin)
164+
endif()

0 commit comments

Comments
 (0)