Skip to content

Commit 2bd5dab

Browse files
author
Andrew Savonichev
authored
[SYCL] Support standard library functions for AOT compilation (#2012)
Fallback libraries are now compiled into object files, so they can be linked at compile time. Signed-off-by: Andrew Savonichev <andrew.savonichev@intel.com>
1 parent bde1085 commit 2bd5dab

File tree

4 files changed

+113
-16
lines changed

4 files changed

+113
-16
lines changed

libdevice/cmake/modules/SYCLLibdevice.cmake

+80-13
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,13 @@ endif()
66

77
set(clang $<TARGET_FILE:clang>)
88

9+
string(CONCAT sycl_targets_opt
10+
"-fsycl-targets="
11+
"spir64_x86_64-unknown-unknown-sycldevice,"
12+
"spir64_gen-unknown-unknown-sycldevice,"
13+
"spir64_fpga-unknown-unknown-sycldevice,"
14+
"spir64-unknown-unknown-sycldevice")
15+
916
set(compile_opts
1017
# suppress an error about SYCL_EXTERNAL being used for
1118
# a function with a raw pointer parameter.
@@ -22,62 +29,62 @@ if (WIN32)
2229
set(devicelib-obj-file ${binary_dir}/libsycl-msvc.o)
2330
add_custom_command(OUTPUT ${devicelib-obj-file}
2431
COMMAND ${clang} -fsycl -c
25-
${compile_opts}
32+
${compile_opts} ${sycl_targets_opt}
2633
${CMAKE_CURRENT_SOURCE_DIR}/msvc_wrapper.cpp
2734
-o ${devicelib-obj-file}
2835
MAIN_DEPENDENCY msvc_wrapper.cpp
29-
DEPENDS wrapper.h device.h spirv_vars.h clang
36+
DEPENDS wrapper.h device.h spirv_vars.h clang clang-offload-bundler
3037
VERBATIM)
3138
else()
3239
set(devicelib-obj-file ${binary_dir}/libsycl-glibc.o)
3340
add_custom_command(OUTPUT ${devicelib-obj-file}
3441
COMMAND ${clang} -fsycl -c
35-
${compile_opts}
42+
${compile_opts} ${sycl_targets_opt}
3643
${CMAKE_CURRENT_SOURCE_DIR}/glibc_wrapper.cpp
3744
-o ${devicelib-obj-file}
3845
MAIN_DEPENDENCY glibc_wrapper.cpp
39-
DEPENDS wrapper.h device.h spirv_vars.h clang
46+
DEPENDS wrapper.h device.h spirv_vars.h clang clang-offload-bundler
4047
VERBATIM)
4148
endif()
4249

4350
set(devicelib-obj-complex ${binary_dir}/libsycl-complex.o)
4451
add_custom_command(OUTPUT ${devicelib-obj-complex}
4552
COMMAND ${clang} -fsycl -c
46-
${compile_opts}
53+
${compile_opts} ${sycl_targets_opt}
4754
${CMAKE_CURRENT_SOURCE_DIR}/complex_wrapper.cpp
4855
-o ${devicelib-obj-complex}
4956
MAIN_DEPENDENCY complex_wrapper.cpp
50-
DEPENDS device_complex.h device.h clang
57+
DEPENDS device_complex.h device.h clang clang-offload-bundler
5158
VERBATIM)
5259

5360
set(devicelib-obj-complex-fp64 ${binary_dir}/libsycl-complex-fp64.o)
5461
add_custom_command(OUTPUT ${devicelib-obj-complex-fp64}
5562
COMMAND ${clang} -fsycl -c
56-
${compile_opts}
63+
${compile_opts} ${sycl_targets_opt}
5764
${CMAKE_CURRENT_SOURCE_DIR}/complex_wrapper_fp64.cpp
5865
-o ${devicelib-obj-complex-fp64}
5966
MAIN_DEPENDENCY complex_wrapper_fp64.cpp
60-
DEPENDS device_complex.h device.h clang
67+
DEPENDS device_complex.h device.h clang clang-offload-bundler
6168
VERBATIM)
6269

6370
set(devicelib-obj-cmath ${binary_dir}/libsycl-cmath.o)
6471
add_custom_command(OUTPUT ${devicelib-obj-cmath}
6572
COMMAND ${clang} -fsycl -c
66-
${compile_opts}
73+
${compile_opts} ${sycl_targets_opt}
6774
${CMAKE_CURRENT_SOURCE_DIR}/cmath_wrapper.cpp
6875
-o ${devicelib-obj-cmath}
6976
MAIN_DEPENDENCY cmath_wrapper.cpp
70-
DEPENDS device_math.h device.h clang
77+
DEPENDS device_math.h device.h clang clang-offload-bundler
7178
VERBATIM)
7279

7380
set(devicelib-obj-cmath-fp64 ${binary_dir}/libsycl-cmath-fp64.o)
7481
add_custom_command(OUTPUT ${devicelib-obj-cmath-fp64}
7582
COMMAND ${clang} -fsycl -c
76-
${compile_opts}
83+
${compile_opts} ${sycl_targets_opt}
7784
${CMAKE_CURRENT_SOURCE_DIR}/cmath_wrapper_fp64.cpp
7885
-o ${devicelib-obj-cmath-fp64}
7986
MAIN_DEPENDENCY cmath_wrapper_fp64.cpp
80-
DEPENDS device_math.h device.h clang
87+
DEPENDS device_math.h device.h clang clang-offload-bundler
8188
VERBATIM)
8289

8390
add_custom_command(OUTPUT ${binary_dir}/libsycl-fallback-cassert.spv
@@ -89,6 +96,15 @@ add_custom_command(OUTPUT ${binary_dir}/libsycl-fallback-cassert.spv
8996
DEPENDS wrapper.h device.h clang spirv_vars.h llvm-spirv
9097
VERBATIM)
9198

99+
add_custom_command(OUTPUT ${binary_dir}/libsycl-fallback-cassert.o
100+
COMMAND ${clang} -fsycl -c
101+
${compile_opts} ${sycl_targets_opt}
102+
${CMAKE_CURRENT_SOURCE_DIR}/fallback-cassert.cpp
103+
-o ${binary_dir}/libsycl-fallback-cassert.o
104+
MAIN_DEPENDENCY fallback-cassert.cpp
105+
DEPENDS wrapper.h device.h clang spirv_vars.h clang-offload-bundler
106+
VERBATIM)
107+
92108
add_custom_command(OUTPUT ${binary_dir}/libsycl-fallback-complex.spv
93109
COMMAND ${clang} -S -fsycl-device-only -fno-sycl-use-bitcode
94110
${compile_opts}
@@ -98,6 +114,15 @@ add_custom_command(OUTPUT ${binary_dir}/libsycl-fallback-complex.spv
98114
DEPENDS device_math.h device_complex.h device.h clang llvm-spirv
99115
VERBATIM)
100116

117+
add_custom_command(OUTPUT ${binary_dir}/libsycl-fallback-complex.o
118+
COMMAND ${clang} -fsycl -c
119+
${compile_opts} ${sycl_targets_opt}
120+
${CMAKE_CURRENT_SOURCE_DIR}/fallback-complex.cpp
121+
-o ${binary_dir}/libsycl-fallback-complex.o
122+
MAIN_DEPENDENCY fallback-complex.cpp
123+
DEPENDS device_math.h device_complex.h device.h clang clang-offload-bundler
124+
VERBATIM)
125+
101126
add_custom_command(OUTPUT ${binary_dir}/libsycl-fallback-complex-fp64.spv
102127
COMMAND ${clang} -S -fsycl-device-only -fno-sycl-use-bitcode
103128
${compile_opts}
@@ -107,6 +132,15 @@ add_custom_command(OUTPUT ${binary_dir}/libsycl-fallback-complex-fp64.spv
107132
DEPENDS device_math.h device_complex.h device.h clang llvm-spirv
108133
VERBATIM)
109134

135+
add_custom_command(OUTPUT ${binary_dir}/libsycl-fallback-complex-fp64.o
136+
COMMAND ${clang} -fsycl -c
137+
${compile_opts} ${sycl_targets_opt}
138+
${CMAKE_CURRENT_SOURCE_DIR}/fallback-complex-fp64.cpp
139+
-o ${binary_dir}/libsycl-fallback-complex-fp64.o
140+
MAIN_DEPENDENCY fallback-complex-fp64.cpp
141+
DEPENDS device_math.h device_complex.h device.h clang clang-offload-bundler
142+
VERBATIM)
143+
110144
add_custom_command(OUTPUT ${binary_dir}/libsycl-fallback-cmath.spv
111145
COMMAND ${clang} -S -fsycl-device-only -fno-sycl-use-bitcode
112146
${compile_opts}
@@ -116,6 +150,15 @@ add_custom_command(OUTPUT ${binary_dir}/libsycl-fallback-cmath.spv
116150
DEPENDS device_math.h device.h clang llvm-spirv
117151
VERBATIM)
118152

153+
add_custom_command(OUTPUT ${binary_dir}/libsycl-fallback-cmath.o
154+
COMMAND ${clang} -fsycl -c
155+
${compile_opts} ${sycl_targets_opt}
156+
${CMAKE_CURRENT_SOURCE_DIR}/fallback-cmath.cpp
157+
-o ${binary_dir}/libsycl-fallback-cmath.o
158+
MAIN_DEPENDENCY fallback-cmath.cpp
159+
DEPENDS device_math.h device.h clang clang-offload-bundler
160+
VERBATIM)
161+
119162
add_custom_command(OUTPUT ${binary_dir}/libsycl-fallback-cmath-fp64.spv
120163
COMMAND ${clang} -S -fsycl-device-only -fno-sycl-use-bitcode
121164
${compile_opts}
@@ -125,6 +168,15 @@ add_custom_command(OUTPUT ${binary_dir}/libsycl-fallback-cmath-fp64.spv
125168
DEPENDS device_math.h device.h clang llvm-spirv
126169
VERBATIM)
127170

171+
add_custom_command(OUTPUT ${binary_dir}/libsycl-fallback-cmath-fp64.o
172+
COMMAND ${clang} -fsycl -c
173+
${compile_opts} ${sycl_targets_opt}
174+
${CMAKE_CURRENT_SOURCE_DIR}/fallback-cmath-fp64.cpp
175+
-o ${binary_dir}/libsycl-fallback-cmath-fp64.o
176+
MAIN_DEPENDENCY fallback-cmath-fp64.cpp
177+
DEPENDS device_math.h device.h clang clang-offload-bundler
178+
VERBATIM)
179+
128180
add_custom_target(libsycldevice-obj DEPENDS
129181
${devicelib-obj-file}
130182
${devicelib-obj-complex}
@@ -138,8 +190,18 @@ add_custom_target(libsycldevice-spv DEPENDS
138190
${binary_dir}/libsycl-fallback-complex-fp64.spv
139191
${binary_dir}/libsycl-fallback-cmath.spv
140192
${binary_dir}/libsycl-fallback-cmath-fp64.spv
193+
)
194+
add_custom_target(libsycldevice-fallback-obj DEPENDS
195+
${binary_dir}/libsycl-fallback-cassert.o
196+
${binary_dir}/libsycl-fallback-complex.o
197+
${binary_dir}/libsycl-fallback-complex-fp64.o
198+
${binary_dir}/libsycl-fallback-cmath.o
199+
${binary_dir}/libsycl-fallback-cmath-fp64.o
141200
)
142-
add_custom_target(libsycldevice DEPENDS libsycldevice-obj libsycldevice-spv)
201+
add_custom_target(libsycldevice DEPENDS
202+
libsycldevice-obj
203+
libsycldevice-fallback-obj
204+
libsycldevice-spv)
143205

144206
# Place device libraries near the libsycl.so library in an install
145207
# directory as well
@@ -151,13 +213,18 @@ endif()
151213

152214
install(FILES ${devicelib-obj-file}
153215
${binary_dir}/libsycl-fallback-cassert.spv
216+
${binary_dir}/libsycl-fallback-cassert.o
154217
${devicelib-obj-complex}
155218
${binary_dir}/libsycl-fallback-complex.spv
219+
${binary_dir}/libsycl-fallback-complex.o
156220
${devicelib-obj-complex-fp64}
157221
${binary_dir}/libsycl-fallback-complex-fp64.spv
222+
${binary_dir}/libsycl-fallback-complex-fp64.o
158223
${devicelib-obj-cmath}
159224
${binary_dir}/libsycl-fallback-cmath.spv
225+
${binary_dir}/libsycl-fallback-cmath.o
160226
${devicelib-obj-cmath-fp64}
161227
${binary_dir}/libsycl-fallback-cmath-fp64.spv
228+
${binary_dir}/libsycl-fallback-cmath-fp64.o
162229
DESTINATION ${install_dest}
163230
COMPONENT libsycldevice)

sycl/doc/extensions/C-CXX-StandardLibrary/C-CXX-StandardLibrary.rst

+14-3
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,16 @@ or, in case of Windows:
2222
clang++ -fsycl -c main.cpp -o main.obj
2323
clang++ -fsycl main.obj %SYCL_INSTALL%/lib/libsycl-msvc.o -o a.exe
2424
25+
For Ahead-Of-Time compilation (AOT), fallback libraries (object files)
26+
must be linked as well:
27+
28+
.. code:
29+
clang++ -fsycl -c -fsycl-targets=spir64_x86_64-unknown-unknown-sycldevice \
30+
main.cpp -o main.o
31+
clang++ -fsycl -fsycl-targets=spir64_x86_64-unknown-unknown-sycldevice \
32+
main.o $(SYCL_INSTALL)/lib/libsycl-glibc.o \
33+
$(SYCL_INSTALL)/lib/libsycl-fallback-cassert.o -o a.out
34+
2535
List of supported functions from C standard library:
2636
- assert macro (from <assert.h> or <cassert>)
2737
- logf, log (from <math.h> or <cmath>)
@@ -270,6 +280,7 @@ Every set of functions is implemented in a separate fallback
270280
library. For example, a fallback for `cl_intel_devicelib_cassert`
271281
extension is provided as `libsycl-fallback-cassert.spv`
272282

273-
NOTE that AOT compilation is not yet supported. Driver will have to
274-
check for extension support and link the corresponding SPIR-V fallback
275-
implementation, but this is not implemented yet.
283+
For AOT compilation, fallback libraries are provided as object files
284+
(e.g. `libsycl-fallback-cassert.o`) which contain device code in LLVM
285+
IR format. Device code in these object files is equivalent to device
286+
code in the `*.spv` files.

sycl/test/devicelib/assert-aot.cpp

+5
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
// REQUIRES: opencl-aot, cpu, linux
2+
3+
// RUN: %clangxx -fsycl -fsycl-targets=spir64_x86_64-unknown-unknown-sycldevice %S/assert.cpp %sycl_libs_dir/libsycl-glibc.o %sycl_libs_dir/libsycl-fallback-cassert.o -o %t.aot.out
4+
// RUN: %CPU_RUN_PLACEHOLDER %t.aot.out >%t.aot.msg
5+
// RUN: FileCheck %S/assert.cpp --input-file %t.aot.msg --check-prefixes=CHECK-MESSAGE

sycl/test/devicelib/cmath-aot.cpp

+14
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
// REQUIRES: opencl-aot, cpu
2+
// UNSUPPORTED: windows
3+
4+
// RUN: %clangxx -fsycl -fsycl-targets=spir64_x86_64-unknown-unknown-sycldevice %S/cmath_test.cpp %sycl_libs_dir/libsycl-cmath.o %sycl_libs_dir/libsycl-fallback-cmath.o -o %t.cmath.out
5+
// RUN: %CPU_RUN_PLACEHOLDER %t.cmath.out
6+
7+
// RUN: %clangxx -fsycl -fsycl-targets=spir64_x86_64-unknown-unknown-sycldevice %S/cmath_fp64_test.cpp %sycl_libs_dir/libsycl-cmath-fp64.o %sycl_libs_dir/libsycl-fallback-cmath-fp64.o -o %t.cmath.fp64.out
8+
// RUN: %CPU_RUN_PLACEHOLDER %t.cmath.fp64.out
9+
10+
// RUN: %clangxx -fsycl -fsycl-targets=spir64_x86_64-unknown-unknown-sycldevice %S/std_complex_math_test.cpp %sycl_libs_dir/libsycl-complex.o %sycl_libs_dir/libsycl-cmath.o %sycl_libs_dir/libsycl-fallback-complex.o %sycl_libs_dir/libsycl-fallback-cmath.o -o %t.complex.out
11+
// RUN: %CPU_RUN_PLACEHOLDER %t.complex.out
12+
13+
// RUN: %clangxx -fsycl -fsycl-targets=spir64_x86_64-unknown-unknown-sycldevice %S/std_complex_math_fp64_test.cpp %sycl_libs_dir/libsycl-complex-fp64.o %sycl_libs_dir/libsycl-cmath-fp64.o %sycl_libs_dir/libsycl-fallback-complex-fp64.o %sycl_libs_dir/libsycl-fallback-cmath-fp64.o -o %t.complex.fp64.out
14+
// RUN: %CPU_RUN_PLACEHOLDER %t.complex.fp64.out

0 commit comments

Comments
 (0)