Skip to content

Commit c2221f0

Browse files
AlexeySachkovArtem Gindinson
and
Artem Gindinson
authored
[SYCL][Driver] Expose llvm-foreach --jobs functionality through a driver option (#4543)
After #4360 extended `llvm-foreach` with an option to specify the desired number of parallel jobs, expose this functionality to the DPC++ compiler users. Co-authored-by: Alexey Sachkov <alexey.sachkov@intel.com> Co-authored-by: Artem Gindinson <artem.gindinson@intel.com>
1 parent 4ceba5b commit c2221f0

File tree

6 files changed

+62
-15
lines changed

6 files changed

+62
-15
lines changed

clang/include/clang/Driver/Options.td

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2685,6 +2685,11 @@ def fsycl_footer_path_EQ : Joined<["-"], "fsycl-footer-path=">,
26852685
def fno_sycl_link_spirv : Flag<["-"], "fno-sycl-link-spirv">,
26862686
Flags<[CoreOption]>, HelpText<"Disable adding of the default (spir64) triple "
26872687
"when discovered in user specified objects and archives.">;
2688+
def fsycl_max_parallel_jobs_EQ : Joined<["-"], "fsycl-max-parallel-link-jobs=">,
2689+
Flags<[CoreOption]>, Group<f_Group>,
2690+
HelpText<"Experimental feature: Controls the maximum parallelism of actions performed "
2691+
"on SYCL device code post-link, i.e. the generation of SPIR-V device images "
2692+
"or AOT compilation of each device image.">;
26882693
def fsyntax_only : Flag<["-"], "fsyntax-only">,
26892694
Flags<[NoXarchOption,CoreOption,CC1Option,FC1Option]>, Group<Action_Group>;
26902695
def ftabstop_EQ : Joined<["-"], "ftabstop=">, Group<f_Group>;

clang/lib/Driver/ToolChains/Clang.cpp

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8794,6 +8794,11 @@ void SPIRVTranslator::ConstructJob(Compilation &C, const JobAction &JA,
87948794
TCArgs.MakeArgString("--out-file-list=" + OutputFileName));
87958795
ForeachArgs.push_back(
87968796
TCArgs.MakeArgString("--out-replace=" + OutputFileName));
8797+
StringRef ParallelJobs =
8798+
TCArgs.getLastArgValue(options::OPT_fsycl_max_parallel_jobs_EQ);
8799+
if (!ParallelJobs.empty())
8800+
ForeachArgs.push_back(TCArgs.MakeArgString("--jobs=" + ParallelJobs));
8801+
87978802
ForeachArgs.push_back(TCArgs.MakeArgString("--"));
87988803
ForeachArgs.push_back(TCArgs.MakeArgString(Cmd->getExecutable()));
87998804

clang/lib/Driver/ToolChains/SYCL.cpp

Lines changed: 25 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -97,8 +97,8 @@ void SYCL::constructLLVMForeachCommand(Compilation &C, const JobAction &JA,
9797
std::unique_ptr<Command> InputCommand,
9898
const InputInfoList &InputFiles,
9999
const InputInfo &Output, const Tool *T,
100-
StringRef Increment,
101-
StringRef Ext = "out") {
100+
StringRef Increment, StringRef Ext,
101+
StringRef ParallelJobs) {
102102
// Construct llvm-foreach command.
103103
// The llvm-foreach command looks like this:
104104
// llvm-foreach --in-file-list=a.list --in-replace='{}' -- echo '{}'
@@ -120,6 +120,9 @@ void SYCL::constructLLVMForeachCommand(Compilation &C, const JobAction &JA,
120120
if (!Increment.empty())
121121
ForeachArgs.push_back(
122122
C.getArgs().MakeArgString("--out-increment=" + Increment));
123+
if (!ParallelJobs.empty())
124+
ForeachArgs.push_back(C.getArgs().MakeArgString("--jobs=" + ParallelJobs));
125+
123126
ForeachArgs.push_back(C.getArgs().MakeArgString("--"));
124127
ForeachArgs.push_back(
125128
C.getArgs().MakeArgString(InputCommand->getExecutable()));
@@ -392,10 +395,12 @@ void SYCL::fpga::BackendCompiler::constructOpenCLAOTCommand(
392395
const char *Exec = C.getArgs().MakeArgString(ExecPath);
393396
auto Cmd = std::make_unique<Command>(JA, *this, ResponseFileSupport::None(),
394397
Exec, CmdArgs, None);
395-
if (!ForeachInputs.empty())
398+
if (!ForeachInputs.empty()) {
399+
StringRef ParallelJobs =
400+
Args.getLastArgValue(options::OPT_fsycl_max_parallel_jobs_EQ);
396401
constructLLVMForeachCommand(C, JA, std::move(Cmd), ForeachInputs, Output,
397-
this, "", ForeachExt);
398-
else
402+
this, "", ForeachExt, ParallelJobs);
403+
} else
399404
C.addCommand(std::move(Cmd));
400405
}
401406

@@ -557,10 +562,12 @@ void SYCL::fpga::BackendCompiler::ConstructJob(
557562
auto Cmd = std::make_unique<Command>(JA, *this, ResponseFileSupport::None(),
558563
Exec, CmdArgs, None);
559564
addFPGATimingDiagnostic(Cmd, C);
560-
if (!ForeachInputs.empty())
565+
if (!ForeachInputs.empty()) {
566+
StringRef ParallelJobs =
567+
Args.getLastArgValue(options::OPT_fsycl_max_parallel_jobs_EQ);
561568
constructLLVMForeachCommand(C, JA, std::move(Cmd), ForeachInputs, Output,
562-
this, ReportOptArg, ForeachExt);
563-
else
569+
this, ReportOptArg, ForeachExt, ParallelJobs);
570+
} else
564571
C.addCommand(std::move(Cmd));
565572
}
566573

@@ -596,10 +603,12 @@ void SYCL::gen::BackendCompiler::ConstructJob(Compilation &C,
596603
const char *Exec = C.getArgs().MakeArgString(ExecPath);
597604
auto Cmd = std::make_unique<Command>(JA, *this, ResponseFileSupport::None(),
598605
Exec, CmdArgs, None);
599-
if (!ForeachInputs.empty())
606+
if (!ForeachInputs.empty()) {
607+
StringRef ParallelJobs =
608+
Args.getLastArgValue(options::OPT_fsycl_max_parallel_jobs_EQ);
600609
constructLLVMForeachCommand(C, JA, std::move(Cmd), ForeachInputs, Output,
601-
this, "");
602-
else
610+
this, "", "out", ParallelJobs);
611+
} else
603612
C.addCommand(std::move(Cmd));
604613
}
605614

@@ -629,10 +638,12 @@ void SYCL::x86_64::BackendCompiler::ConstructJob(
629638
const char *Exec = C.getArgs().MakeArgString(ExecPath);
630639
auto Cmd = std::make_unique<Command>(JA, *this, ResponseFileSupport::None(),
631640
Exec, CmdArgs, None);
632-
if (!ForeachInputs.empty())
641+
if (!ForeachInputs.empty()) {
642+
StringRef ParallelJobs =
643+
Args.getLastArgValue(options::OPT_fsycl_max_parallel_jobs_EQ);
633644
constructLLVMForeachCommand(C, JA, std::move(Cmd), ForeachInputs, Output,
634-
this, "");
635-
else
645+
this, "", "out", ParallelJobs);
646+
} else
636647
C.addCommand(std::move(Cmd));
637648
}
638649

clang/lib/Driver/ToolChains/SYCL.h

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -36,7 +36,8 @@ void constructLLVMForeachCommand(Compilation &C, const JobAction &JA,
3636
std::unique_ptr<Command> InputCommand,
3737
const InputInfoList &InputFiles,
3838
const InputInfo &Output, const Tool *T,
39-
StringRef Increment, StringRef Ext);
39+
StringRef Increment, StringRef Ext = "out",
40+
StringRef ParallelJobs = "");
4041

4142
// Runs llvm-spirv to convert spirv to bc, llvm-link, which links multiple LLVM
4243
// bitcode. Converts generated bc back to spirv using llvm-spirv, wraps with

clang/test/Driver/sycl-offload-with-split.c

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -220,6 +220,22 @@
220220

221221
/// ###########################################################################
222222

223+
/// Check parallel compilation enforcement for split modules when running SPIR-V translation and AOT compilation
224+
// RUN: %clang -target x86_64-unknown-linux-gnu -fsycl -fsycl-max-parallel-link-jobs=4 -fsycl-targets=spir64-unknown-unknown %s -### 2>&1 \
225+
// RUN: | FileCheck %s -check-prefixes=CHK-PARALLEL-JOBS
226+
// RUN: %clang -target x86_64-unknown-linux-gnu -fsycl -fsycl-max-parallel-link-jobs=4 -fsycl-targets=spir64_fpga-unknown-unknown -Xshardware %s -### 2>&1 \
227+
// RUN: | FileCheck %s -check-prefixes=CHK-PARALLEL-JOBS,CHK-PARALLEL-JOBS-AOT -DBE_COMPILER=aoc
228+
// RUN: %clang -target x86_64-unknown-linux-gnu -fsycl -fsycl-max-parallel-link-jobs=4 -fintelfpga -Xshardware %s -### 2>&1 \
229+
// RUN: | FileCheck %s -check-prefixes=CHK-PARALLEL-JOBS,CHK-PARALLEL-JOBS-AOT -DBE_COMPILER=aoc
230+
// RUN: %clang -target x86_64-unknown-linux-gnu -fsycl -fsycl-max-parallel-link-jobs=4 -fsycl-targets=spir64_gen-unknown-unknown %s -### 2>&1 \
231+
// RUN: | FileCheck %s -check-prefixes=CHK-PARALLEL-JOBS,CHK-PARALLEL-JOBS-AOT -DBE_COMPILER=ocloc
232+
// RUN: %clang -target x86_64-unknown-linux-gnu -fsycl -fsycl-max-parallel-link-jobs=4 -fsycl-targets=spir64_x86_64-unknown-unknown %s -### 2>&1 \
233+
// RUN: | FileCheck %s -check-prefixes=CHK-PARALLEL-JOBS,CHK-PARALLEL-JOBS-AOT -DBE_COMPILER=opencl-aot
234+
// CHK-PARALLEL-JOBS: llvm-foreach{{.*}} "--jobs=4" "--" "{{.*}}llvm-spirv{{.*}}"
235+
// CHK-PARALLEL-JOBS-AOT: llvm-foreach{{.*}} "--jobs=4" "--" "{{.*}}[[BE_COMPILER]]{{.*}}
236+
237+
/// ###########################################################################
238+
223239
/// offload with multiple targets, including AOT
224240
// RUN: %clang -target x86_64-unknown-linux-gnu -fsycl -fno-sycl-device-lib=all -fsycl-device-code-split -fsycl-targets=spir64-unknown-unknown,spir64_fpga-unknown-unknown,spir64_gen-unknown-unknown -ccc-print-phases %s 2>&1 \
225241
// RUN: | FileCheck -check-prefix=CHK-PHASE-MULTI-TARG %s

sycl/doc/UsersManual.md

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -176,6 +176,15 @@ and not recommended to use in production environment.
176176
* auto - the compiler will use a heuristic to select the best way of
177177
splitting device code. This is default mode.
178178

179+
**`-fsycl-max-parallel-link-jobs=<N>`**
180+
181+
Experimental feature. When specified, it informs the compiler
182+
that it can simultaneously spawn up to `N` processes to perform
183+
actions required to link the DPC++ application. This option is
184+
only useful in SYCL mode. It only takes effect if link action
185+
needs to be executed, i.e. it won't have any effect in presence of
186+
options like `-c` or `-E`. Default value of `N` is 1.
187+
179188
**`-f[no-]sycl-device-lib=<lib1>[,<lib2>,...]`**
180189

181190
Enables/disables linking of the device libraries. Supported libraries:

0 commit comments

Comments
 (0)