Skip to content

Commit 5c807fa

Browse files
AlexeySachkovArtem Gindinson
andcommitted
Expose llvm-foreach --jobs functionality through a driver option
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 <[email protected]> Co-authored-by: Artem Gindinson <[email protected]>
1 parent 1b47b92 commit 5c807fa

File tree

5 files changed

+55
-15
lines changed

5 files changed

+55
-15
lines changed

clang/include/clang/Driver/Options.td

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2680,6 +2680,11 @@ def fsycl_footer_path_EQ : Joined<["-"], "fsycl-footer-path=">,
26802680
def fno_sycl_link_spirv : Flag<["-"], "fno-sycl-link-spirv">,
26812681
Flags<[CoreOption]>, HelpText<"Disable adding of the default (spir64) triple "
26822682
"when discovered in user specified objects and archives.">;
2683+
def fsycl_parallel_jobs_EQ : Joined<["-"], "fsycl-parallel-jobs=">,
2684+
Flags<[CoreOption]>, Group<f_Group>,
2685+
HelpText<"Controls the parallelism of post device code link actions performed"
2686+
"by the toolchain, like generating SPIR-V files for each device image"
2687+
"or performing an AOT compilation for each device image">;
26832688
def fsyntax_only : Flag<["-"], "fsyntax-only">,
26842689
Flags<[NoXarchOption,CoreOption,CC1Option,FC1Option]>, Group<Action_Group>;
26852690
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
@@ -8803,6 +8803,11 @@ void SPIRVTranslator::ConstructJob(Compilation &C, const JobAction &JA,
88038803
TCArgs.MakeArgString("--out-file-list=" + OutputFileName));
88048804
ForeachArgs.push_back(
88058805
TCArgs.MakeArgString("--out-replace=" + OutputFileName));
8806+
StringRef ParallelJobs =
8807+
TCArgs.getLastArgValue(options::OPT_fsycl_parallel_jobs_EQ);
8808+
if (!ParallelJobs.empty())
8809+
ForeachArgs.push_back(TCArgs.MakeArgString("--jobs=" + ParallelJobs));
8810+
88068811
ForeachArgs.push_back(TCArgs.MakeArgString("--"));
88078812
ForeachArgs.push_back(TCArgs.MakeArgString(Cmd->getExecutable()));
88088813

clang/lib/Driver/ToolChains/SYCL.cpp

Lines changed: 25 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -100,8 +100,8 @@ void SYCL::constructLLVMForeachCommand(Compilation &C, const JobAction &JA,
100100
std::unique_ptr<Command> InputCommand,
101101
const InputInfoList &InputFiles,
102102
const InputInfo &Output, const Tool *T,
103-
StringRef Increment,
104-
StringRef Ext = "out") {
103+
StringRef Increment, StringRef Ext,
104+
StringRef ParallelJobs) {
105105
// Construct llvm-foreach command.
106106
// The llvm-foreach command looks like this:
107107
// llvm-foreach --in-file-list=a.list --in-replace='{}' -- echo '{}'
@@ -123,6 +123,9 @@ void SYCL::constructLLVMForeachCommand(Compilation &C, const JobAction &JA,
123123
if (!Increment.empty())
124124
ForeachArgs.push_back(
125125
C.getArgs().MakeArgString("--out-increment=" + Increment));
126+
if (!ParallelJobs.empty())
127+
ForeachArgs.push_back(C.getArgs().MakeArgString("--jobs=" + ParallelJobs));
128+
126129
ForeachArgs.push_back(C.getArgs().MakeArgString("--"));
127130
ForeachArgs.push_back(
128131
C.getArgs().MakeArgString(InputCommand->getExecutable()));
@@ -395,10 +398,12 @@ void SYCL::fpga::BackendCompiler::constructOpenCLAOTCommand(
395398
const char *Exec = C.getArgs().MakeArgString(ExecPath);
396399
auto Cmd = std::make_unique<Command>(JA, *this, ResponseFileSupport::None(),
397400
Exec, CmdArgs, None);
398-
if (!ForeachInputs.empty())
401+
if (!ForeachInputs.empty()) {
402+
StringRef ParallelJobs =
403+
Args.getLastArgValue(options::OPT_fsycl_parallel_jobs_EQ);
399404
constructLLVMForeachCommand(C, JA, std::move(Cmd), ForeachInputs, Output,
400-
this, "", ForeachExt);
401-
else
405+
this, "", ForeachExt, ParallelJobs);
406+
} else
402407
C.addCommand(std::move(Cmd));
403408
}
404409

@@ -560,10 +565,12 @@ void SYCL::fpga::BackendCompiler::ConstructJob(
560565
auto Cmd = std::make_unique<Command>(JA, *this, ResponseFileSupport::None(),
561566
Exec, CmdArgs, None);
562567
addFPGATimingDiagnostic(Cmd, C);
563-
if (!ForeachInputs.empty())
568+
if (!ForeachInputs.empty()) {
569+
StringRef ParallelJobs =
570+
Args.getLastArgValue(options::OPT_fsycl_parallel_jobs_EQ);
564571
constructLLVMForeachCommand(C, JA, std::move(Cmd), ForeachInputs, Output,
565-
this, ReportOptArg, ForeachExt);
566-
else
572+
this, ReportOptArg, ForeachExt, ParallelJobs);
573+
} else
567574
C.addCommand(std::move(Cmd));
568575
}
569576

@@ -599,10 +606,12 @@ void SYCL::gen::BackendCompiler::ConstructJob(Compilation &C,
599606
const char *Exec = C.getArgs().MakeArgString(ExecPath);
600607
auto Cmd = std::make_unique<Command>(JA, *this, ResponseFileSupport::None(),
601608
Exec, CmdArgs, None);
602-
if (!ForeachInputs.empty())
609+
if (!ForeachInputs.empty()) {
610+
StringRef ParallelJobs =
611+
Args.getLastArgValue(options::OPT_fsycl_parallel_jobs_EQ);
603612
constructLLVMForeachCommand(C, JA, std::move(Cmd), ForeachInputs, Output,
604-
this, "");
605-
else
613+
this, "", "out", ParallelJobs);
614+
} else
606615
C.addCommand(std::move(Cmd));
607616
}
608617

@@ -632,10 +641,12 @@ void SYCL::x86_64::BackendCompiler::ConstructJob(
632641
const char *Exec = C.getArgs().MakeArgString(ExecPath);
633642
auto Cmd = std::make_unique<Command>(JA, *this, ResponseFileSupport::None(),
634643
Exec, CmdArgs, None);
635-
if (!ForeachInputs.empty())
644+
if (!ForeachInputs.empty()) {
645+
StringRef ParallelJobs =
646+
Args.getLastArgValue(options::OPT_fsycl_parallel_jobs_EQ);
636647
constructLLVMForeachCommand(C, JA, std::move(Cmd), ForeachInputs, Output,
637-
this, "");
638-
else
648+
this, "", "out", ParallelJobs);
649+
} else
639650
C.addCommand(std::move(Cmd));
640651
}
641652

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: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -220,6 +220,24 @@
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-parallel-jobs=4 -fsycl-targets=spir64-unknown-unknown %s -### 2>&1 \
225+
// RUN: | FileCheck %s -check-prefixes=CHK-PARALLEL-JOBS-SPIRV
226+
// RUN: %clang -target x86_64-unknown-linux-gnu -fsycl -fsycl-parallel-jobs=4 -fsycl-targets=spir64_fpga-unknown-unknown -Xshardware %s -### 2>&1 \
227+
// RUN: | FileCheck %s -check-prefixes=CHK-PARALLEL-JOBS-SPIRV,CHK-PARALLEL-JOBS-FPGA
228+
// RUN: %clang -target x86_64-unknown-linux-gnu -fsycl -fsycl-parallel-jobs=4 -fintelfpga -Xshardware %s -### 2>&1 \
229+
// RUN: | FileCheck %s -check-prefixes=CHK-PARALLEL-JOBS-SPIRV,CHK-PARALLEL-JOBS-FPGA
230+
// RUN: %clang -target x86_64-unknown-linux-gnu -fsycl -fsycl-parallel-jobs=4 -fsycl-targets=spir64_gen-unknown-unknown %s -### 2>&1 \
231+
// RUN: | FileCheck %s -check-prefixes=CHK-PARALLEL-JOBS-SPIRV,CHK-PARALLEL-JOBS-GEN
232+
// RUN: %clang -target x86_64-unknown-linux-gnu -fsycl -fsycl-parallel-jobs=4 -fsycl-targets=spir64_x86_64-unknown-unknown %s -### 2>&1 \
233+
// RUN: | FileCheck %s -check-prefixes=CHK-PARALLEL-JOBS-SPIRV,CHK-PARALLEL-JOBS-CPU
234+
// CHK-PARALLEL-JOBS-SPIRV: llvm-foreach{{.*}} "--jobs=4" "--" "{{.*}}llvm-spirv{{.*}}"
235+
// CHK-PARALLEL-JOBS-FPGA: llvm-foreach{{.*}} "--jobs=4" "--" "{{.*}}aoc{{.*}}
236+
// CHK-PARALLEL-JOBS-GEN: llvm-foreach{{.*}} "--jobs=4" "--" "{{.*}}ocloc{{.*}}
237+
// CHK-PARALLEL-JOBS-CPU: llvm-foreach{{.*}} "--jobs=4" "--" "{{.*}}opencl-aot{{.*}}
238+
239+
/// ###########################################################################
240+
223241
/// offload with multiple targets, including AOT
224242
// 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 \
225243
// RUN: | FileCheck -check-prefix=CHK-PHASE-MULTI-TARG %s

0 commit comments

Comments
 (0)