From 86a59190eb49338f86680c833a136cd315689df5 Mon Sep 17 00:00:00 2001 From: Mariya Podchishchaeva Date: Wed, 11 Sep 2019 15:37:16 +0300 Subject: [PATCH 1/4] [SYCL][Doc] Add device code splitting feature design Signed-off-by: Mariya Podchishchaeva --- sycl/doc/DeviceCodeSplitting.png | Bin 0 -> 40077 bytes sycl/doc/SYCLCompilerAndRuntimeDesign.md | 29 +++++++++++++++++++++++ 2 files changed, 29 insertions(+) create mode 100755 sycl/doc/DeviceCodeSplitting.png diff --git a/sycl/doc/DeviceCodeSplitting.png b/sycl/doc/DeviceCodeSplitting.png new file mode 100755 index 0000000000000000000000000000000000000000..dab9edc5c70fc6d63d8b2de4a36ec5344115041e GIT binary patch literal 40077 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 Dmnf&u literal 0 HcmV?d00001 diff --git a/sycl/doc/SYCLCompilerAndRuntimeDesign.md b/sycl/doc/SYCLCompilerAndRuntimeDesign.md index 7d51ed02229a5..3caa323615b50 100644 --- a/sycl/doc/SYCLCompilerAndRuntimeDesign.md +++ b/sycl/doc/SYCLCompilerAndRuntimeDesign.md @@ -394,6 +394,35 @@ llvm-no-spir-kernel host.bc It returns 0 if no kernels are present and 1 otherwise. +#### Device code splitting + +Putting all device code into a single SPIRV module does not work well in the +following cases: +1. There are thousands of kernels defined and only small part of them is used at +run-time. Having them all in one SPIR-V module significantly increases JIT time. +2. Device code can be specialized for different devices. For example, kernels +which are supposed to be executed only on CPU can contain standard C library calls +like "malloc" unavaliable on GPU. This will cause JIT compilation failure on GPU +even if this particular kernel is never called on GPU device. + +To resolve these problems the compiler should be able to split a single module +into smaller ones. The following features should be supported: +* Grouping kernels on per-translation unit basis +* Emitting a separate module for each kernel + +The current approach is: +* Generate special meta-data with translation unit ID for each kernel in SYCL +front-end +* Link all LLVM modules using llvm-link +* Run the module splitter pass on fully linked device code +* Generate a symbol table for each device module for proper module selection in +runtime + +Device code splitting process: +![Device code splitting](DeviceCodeSplitting.png) + +The "split" box will be implemented as dedicated tool ("sycl-split"?). The tool +will run splitter pass and generate a symbol table for each produced device module. ### Integration with SPIR-V format From cddc95d19a60a80bdbbcac8a9844c5e466d5904d Mon Sep 17 00:00:00 2001 From: Mariya Podchishchaeva Date: Fri, 13 Sep 2019 13:59:13 +0300 Subject: [PATCH 2/4] Apply suggestion from CR Signed-off-by: Mariya Podchishchaeva --- sycl/doc/SYCLCompilerAndRuntimeDesign.md | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/sycl/doc/SYCLCompilerAndRuntimeDesign.md b/sycl/doc/SYCLCompilerAndRuntimeDesign.md index 3caa323615b50..ecefec8f956c8 100644 --- a/sycl/doc/SYCLCompilerAndRuntimeDesign.md +++ b/sycl/doc/SYCLCompilerAndRuntimeDesign.md @@ -401,9 +401,9 @@ following cases: 1. There are thousands of kernels defined and only small part of them is used at run-time. Having them all in one SPIR-V module significantly increases JIT time. 2. Device code can be specialized for different devices. For example, kernels -which are supposed to be executed only on CPU can contain standard C library calls -like "malloc" unavaliable on GPU. This will cause JIT compilation failure on GPU -even if this particular kernel is never called on GPU device. +that are supposed to be executed only on FPGA can use extensions avaliable for +FPGA only. This will cause JIT compilation failure on other devices even if this +particular kernel is never called on them. To resolve these problems the compiler should be able to split a single module into smaller ones. The following features should be supported: From 4dc4630322e0d95c3dda5acd7e741a6b1589e14d Mon Sep 17 00:00:00 2001 From: Mariya Podchishchaeva Date: Mon, 16 Sep 2019 12:39:08 +0300 Subject: [PATCH 3/4] Convert the picture to svg format Signed-off-by: Mariya Podchishchaeva --- sycl/doc/DeviceCodeSplitting.png | Bin 40077 -> 0 bytes sycl/doc/DeviceCodeSplitting.svg | 1306 ++++++++++++++++++++++ sycl/doc/SYCLCompilerAndRuntimeDesign.md | 2 +- 3 files changed, 1307 insertions(+), 1 deletion(-) delete mode 100755 sycl/doc/DeviceCodeSplitting.png create mode 100755 sycl/doc/DeviceCodeSplitting.svg diff --git a/sycl/doc/DeviceCodeSplitting.png b/sycl/doc/DeviceCodeSplitting.png deleted file mode 100755 index dab9edc5c70fc6d63d8b2de4a36ec5344115041e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 40077 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 Dmnf&u diff --git a/sycl/doc/DeviceCodeSplitting.svg b/sycl/doc/DeviceCodeSplitting.svg new file mode 100755 index 0000000000000..d619c3b87a310 --- /dev/null +++ b/sycl/doc/DeviceCodeSplitting.svg @@ -0,0 +1,1306 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Page-1 + + + + + Rounded Rectangle + S1.cpp + + + + + + + + + + + + + + + + + + + + + S1.cpp + + Rounded Rectangle.12 + void a() {…} + + + + + + + + + + + + + + + + + + + + + + + + + void a() {…} + + Rounded Rectangle.13 + Kernel x() {b();} + + + + + + + + + + + + + + + + + + + + + + + + + Kernel x() {b();} + + Rounded Rectangle.14 + S2.cpp + + + + + + + + + + + + + + + + + + + + + S2.cpp + + Rounded Rectangle.15 + void b() {…} + + + + + + + + + + + + + + + + + + + + + + + + + void b() {…} + + Rounded Rectangle.16 + Kernel y() {a();} + + + + + + + + + + + + + + + + + + + + + + + + + Kernel y() {a();} + + Rectangle + Front-end + + + + + + + + + + Front-end + + Rectangle.19 + Front-end + + + + + + + + + + Front-end + + Dynamic connector + + + + Dynamic connector.21 + + + + Rounded Rectangle.22 + S1.bc + + + + + + + + + + + + + + + + + + + + + S1.bc + + Rounded Rectangle.23 + void a() {…} + + + + + + + + + + + + + + + + + + + + + + + + + void a() {…} + + Rounded Rectangle.24 + Kernel x() {b();} ‘S1’ + + + + + + + + + + + + + + + + + + + + + + + + + Kernel x() {b();} S1 + + Rounded Rectangle.25 + S2.bc + + + + + + + + + + + + + + + + + + + + + S2.bc + + Rounded Rectangle.26 + void b() {…} + + + + + + + + + + + + + + + + + + + + + + + + + void b() {…} + + Rounded Rectangle.27 + Kernel y() {a();} ‘S2’ + + + + + + + + + + + + + + + + + + + + + + + + + Kernel y() {a();} S2 + + Dynamic connector.28 + + + + Dynamic connector.29 + + + + Rectangle.30 + llvm-link + + + + + + + + + + llvm-link + + Dynamic connector.31 + + + + Dynamic connector.32 + + + + Rounded Rectangle.33 + S1S2.bc + + + + + + + + + + + + + + + + + + + + + S1S2.bc + + Rounded Rectangle.36 + Kernel x() {b();} ‘S1’ + + + + + + + + + + + + + + + + + + + + + + + + + Kernel x() {b();} S1 + + Rounded Rectangle.37 + Kernel y() {a();} ‘S2’ + + + + + + + + + + + + + + + + + + + + + + + + + Kernel y() {a();} S2 + + Rounded Rectangle.38 + void a() {…} + + + + + + + + + + + + + + + + + + + + + + + + + void a() {…} + + Rounded Rectangle.39 + void b() {…} + + + + + + + + + + + + + + + + + + + + + + + + + void b() {…} + + Dynamic connector.40 + + + + Rectangle.41 + split + + + + + + + + + + split + + Dynamic connector.44 + + + + Rounded Rectangle.55 + + + + + + + + + + + + + + + + + + + + + + Rounded Rectangle.57 + S1.bc + + + + + + + + + + + + + + + + + + + + + S1.bc + + Rounded Rectangle.58 + void b() {…} + + + + + + + + + + + + + + + + + + + + + + + + + void b() {…} + + Rounded Rectangle.59 + Kernel x() {b();} + + + + + + + + + + + + + + + + + + + + + + + + + Kernel x() {b();} + + Rounded Rectangle.60 + S1.txt + + + + + + + + + + + + + + + + + + + + + + + + + S1.txt + + Rounded Rectangle.61 + “x” + + + + + + + + + + + + + + + + + + + + + + + + + “x” + + Rounded Rectangle.62 + + + + + + + + + + + + + + + + + + + + + + Rounded Rectangle.63 + S2.bc + + + + + + + + + + + + + + + + + + + + + S2.bc + + Rounded Rectangle.64 + void a() {…} + + + + + + + + + + + + + + + + + + + + + + + + + void a() {…} + + Rounded Rectangle.65 + Kernel y() {a();} + + + + + + + + + + + + + + + + + + + + + + + + + Kernel y() {a();} + + Rounded Rectangle.66 + S2.txt + + + + + + + + + + + + + + + + + + + + + + + + + S2.txt + + Rounded Rectangle.67 + “y” + + + + + + + + + + + + + + + + + + + + + + + + + “y” + + Dynamic connector.68 + + + + Dynamic connector.69 + + + + Rectangle.70 + llvm-spirv + + + + + + + + + + llvm-spirv + + Rounded Rectangle.71 + S1.spv + + + + + + + + + + + + + + + + + + + + + + + + + S1.spv + + Rectangle.72 + aot + + + + + + + + + + aot + + Rounded Rectangle.73 + S1.bin + + + + + + + + + + + + + + + + + + + + + + + + + S1.bin + + Rectangle.74 + llvm-spirv + + + + + + + + + + llvm-spirv + + Rounded Rectangle.75 + S2.spv + + + + + + + + + + + + + + + + + + + + + + + + + S2.spv + + Rectangle.76 + aot + + + + + + + + + + aot + + Rounded Rectangle.77 + S2.bin + + + + + + + + + + + + + + + + + + + + + + + + + S2.bin + + Dynamic connector.78 + + + + Dynamic connector.79 + + + + Dynamic connector.80 + + + + Dynamic connector.81 + + + + Dynamic connector.83 + + + + Dynamic connector.84 + + + + Dynamic connector.85 + + + + Rectangle.88 + clang-offload-wrapper + + + + + + + + + + clang-offload-wrapper + + Dynamic connector.89 + + + + Dynamic connector.91 + + + + Dynamic connector.92 + + + + Dynamic connector.93 + + + + diff --git a/sycl/doc/SYCLCompilerAndRuntimeDesign.md b/sycl/doc/SYCLCompilerAndRuntimeDesign.md index ecefec8f956c8..f0c5e2781cd3f 100644 --- a/sycl/doc/SYCLCompilerAndRuntimeDesign.md +++ b/sycl/doc/SYCLCompilerAndRuntimeDesign.md @@ -419,7 +419,7 @@ front-end runtime Device code splitting process: -![Device code splitting](DeviceCodeSplitting.png) +![Device code splitting](DeviceCodeSplitting.svg) The "split" box will be implemented as dedicated tool ("sycl-split"?). The tool will run splitter pass and generate a symbol table for each produced device module. From 41091ba480c25baf5e9433896eb7b5d8edaddff0 Mon Sep 17 00:00:00 2001 From: Mariya Podchishchaeva Date: Sat, 30 Nov 2019 10:56:15 +0300 Subject: [PATCH 4/4] Update the device code split doc Move picture to images folder Apply comment Signed-off-by: Mariya Podchishchaeva --- sycl/doc/SYCLCompilerAndRuntimeDesign.md | 40 +++++++++++++------ .../DeviceCodeSplit.svg} | 0 2 files changed, 28 insertions(+), 12 deletions(-) rename sycl/doc/{DeviceCodeSplitting.svg => images/DeviceCodeSplit.svg} (100%) diff --git a/sycl/doc/SYCLCompilerAndRuntimeDesign.md b/sycl/doc/SYCLCompilerAndRuntimeDesign.md index f0c5e2781cd3f..182b37bdf0375 100644 --- a/sycl/doc/SYCLCompilerAndRuntimeDesign.md +++ b/sycl/doc/SYCLCompilerAndRuntimeDesign.md @@ -394,7 +394,7 @@ llvm-no-spir-kernel host.bc It returns 0 if no kernels are present and 1 otherwise. -#### Device code splitting +#### Device code split Putting all device code into a single SPIRV module does not work well in the following cases: @@ -405,24 +405,40 @@ that are supposed to be executed only on FPGA can use extensions avaliable for FPGA only. This will cause JIT compilation failure on other devices even if this particular kernel is never called on them. -To resolve these problems the compiler should be able to split a single module -into smaller ones. The following features should be supported: -* Grouping kernels on per-translation unit basis +To resolve these problems the compiler can split a single module into smaller +ones. The following features is supported: +* Emitting a separate module for source (translation unit) * Emitting a separate module for each kernel The current approach is: * Generate special meta-data with translation unit ID for each kernel in SYCL -front-end -* Link all LLVM modules using llvm-link -* Run the module splitter pass on fully linked device code -* Generate a symbol table for each device module for proper module selection in -runtime +front-end. This ID will be used to group kernels on per-translation unit basis +* Link all device LLVM modules using llvm-link +* Perform split on a fully linked module +* Generate a symbol table (list of kernels) for each produced device module for +proper module selection in runtime +* Perform SPIR-V translation and AOT compilation (if requested) on each produced +module separately +* Add information about presented kernels to a wrappring object for each device +image Device code splitting process: -![Device code splitting](DeviceCodeSplitting.svg) +![Device code splitting](images/DeviceCodeSplit.svg) -The "split" box will be implemented as dedicated tool ("sycl-split"?). The tool -will run splitter pass and generate a symbol table for each produced device module. +The "split" box is implemented as functionality of the dedicated tool +`sycl-post-link`. The tool runs a set of LLVM passes to split input module and +generates a symbol table (list of kernels) for each produced device module. + +To enable device code split, a special option must be passed to the clang +driver: + +`-fsycl-device-code-split=` + +There are three possible values for this option: +* `per_source` - enables emitting a separate module for each source (translation +unit) +* `per_kernel` - enables emitting a separate module for each kernel +* `off` - disables device code split ### Integration with SPIR-V format diff --git a/sycl/doc/DeviceCodeSplitting.svg b/sycl/doc/images/DeviceCodeSplit.svg similarity index 100% rename from sycl/doc/DeviceCodeSplitting.svg rename to sycl/doc/images/DeviceCodeSplit.svg