From 2515d7224e70dceecf7abc188efacef690788925 Mon Sep 17 00:00:00 2001 From: Hugh Delaney Date: Mon, 12 Feb 2024 18:06:17 +0000 Subject: [PATCH 1/9] Make some changes for range rounding This commit adds new clang command line option -fsycl-exp-range-rounding. Experimental range rounding maps all 1, 2 or 3 dim range kernels to a 1d range kernel. This can give performance improvements when inner dimensions are oddly shaped. --- clang/include/clang/Basic/LangOptions.def | 1 + clang/include/clang/Driver/Options.td | 4 ++ clang/lib/Driver/ToolChains/Clang.cpp | 3 + clang/lib/Frontend/InitPreprocessor.cpp | 6 ++ clang/lib/Sema/SemaSYCL.cpp | 6 ++ sycl/include/sycl/handler.hpp | 61 +++++++++++++++++++ .../Basic/parallel_for_range_roundup.cpp | 56 +++++++++++++++++ 7 files changed, 137 insertions(+) diff --git a/clang/include/clang/Basic/LangOptions.def b/clang/include/clang/Basic/LangOptions.def index a068796b2811d..8e4d3bb40ea3c 100644 --- a/clang/include/clang/Basic/LangOptions.def +++ b/clang/include/clang/Basic/LangOptions.def @@ -303,6 +303,7 @@ LANGOPT( ENUM_LANGOPT(SYCLRangeRounding, SYCLRangeRoundingPreference, 2, SYCLRangeRoundingPreference::On, "Preference for SYCL parallel_for range rounding") +LANGOPT(SYCLExperimentalRangeRounding, 1, 0, "Use experimental parallel for range rounding") LANGOPT(SYCLEnableIntHeaderDiags, 1, 0, "Enable diagnostics that require the " "SYCL integration header") LANGOPT(SYCLAllowVirtualFunctions, 1, 0, diff --git a/clang/include/clang/Driver/Options.td b/clang/include/clang/Driver/Options.td index b47bea9f00d3d..3b1e8029125ee 100644 --- a/clang/include/clang/Driver/Options.td +++ b/clang/include/clang/Driver/Options.td @@ -4012,6 +4012,10 @@ def fsycl_disable_range_rounding : Flag<["-"], "fsycl-disable-range-rounding">, Alias, AliasArgs<["disable"]>, HelpText<"Deprecated: please use -fsycl-range-rounding=disable instead.">, Flags<[Deprecated]>; +def fsycl_exp_range_rounding : Flag<["-"], "fsycl-exp-range-rounding">, + Visibility<[ClangOption, CLOption, DXCOption, CC1Option]>, + HelpText<"Use experimental range rounding.">, + MarshallingInfoFlag>; def fno_sycl_use_footer : Flag<["-"], "fno-sycl-use-footer">, Visibility<[ClangOption, CLOption, DXCOption]>, HelpText<"Disable usage of the integration footer during SYCL enabled " "compilations.">; diff --git a/clang/lib/Driver/ToolChains/Clang.cpp b/clang/lib/Driver/ToolChains/Clang.cpp index 116c09400577c..62d08305491ad 100644 --- a/clang/lib/Driver/ToolChains/Clang.cpp +++ b/clang/lib/Driver/ToolChains/Clang.cpp @@ -5430,6 +5430,9 @@ void Clang::ConstructJob(Compilation &C, const JobAction &JA, if (Arg *A = Args.getLastArg(options::OPT_fsycl_range_rounding_EQ)) A->render(Args, CmdArgs); + if (Arg *A = Args.getLastArg(options::OPT_fsycl_exp_range_rounding)) + A->render(Args, CmdArgs); + // Add the Unique ID prefix StringRef UniqueID = D.getSYCLUniqueID(Input.getBaseInput()); if (!UniqueID.empty()) diff --git a/clang/lib/Frontend/InitPreprocessor.cpp b/clang/lib/Frontend/InitPreprocessor.cpp index 0dde49bde21a0..f8b4154ea63db 100644 --- a/clang/lib/Frontend/InitPreprocessor.cpp +++ b/clang/lib/Frontend/InitPreprocessor.cpp @@ -589,6 +589,12 @@ static void InitializeStandardPredefinedMacros(const TargetInfo &TI, default: break; } + + // Set __SYCL_EXP_PARALLEL_FOR_RANGE_ROUNDING__ macro for + // both host and device compilations if -fsycl-exp-range-rounding + // flag is used. + if (LangOpts.SYCLExperimentalRangeRounding) + Builder.defineMacro("__SYCL_EXP_PARALLEL_FOR_RANGE_ROUNDING__"); } if (LangOpts.DeclareSPIRVBuiltins) { diff --git a/clang/lib/Sema/SemaSYCL.cpp b/clang/lib/Sema/SemaSYCL.cpp index 0d07d673f3880..4b7764485b83f 100644 --- a/clang/lib/Sema/SemaSYCL.cpp +++ b/clang/lib/Sema/SemaSYCL.cpp @@ -5187,6 +5187,12 @@ void SYCLIntegrationHeader::emit(raw_ostream &O) { break; } + if (S.getLangOpts().SYCLExperimentalRangeRounding) { + O << "#ifndef __SYCL_EXP_PARALLEL_FOR_RANGE_ROUNDING__ \n"; + O << "#define __SYCL_EXP_PARALLEL_FOR_RANGE_ROUNDING__ 1\n"; + O << "#endif //__SYCL_EXP_PARALLEL_FOR_RANGE_ROUNDING__\n\n"; + } + if (SpecConsts.size() > 0) { O << "// Forward declarations of templated spec constant types:\n"; for (const auto &SC : SpecConsts) diff --git a/sycl/include/sycl/handler.hpp b/sycl/include/sycl/handler.hpp index 772f09773b561..3bcfba5e9d0a4 100644 --- a/sycl/include/sycl/handler.hpp +++ b/sycl/include/sycl/handler.hpp @@ -1241,6 +1241,67 @@ class __SYCL_EXPORT handler { DidAdjust = true; }; +#ifdef __SYCL_EXP_PARALLEL_FOR_RANGE_ROUNDING__ + // Experimental rounded range kernel will always make range 1d and will use + // the UserRange in kernel to calculate the indexes + // In kernel ID "getter" funcs will be calculated using UserRange: + // + // globalIDRounded: + // [0]: globalInvocationId.x % UserRange[0]; + // [1]: globalInvocationId.x / UserRange[0]; + // [2]: globalInvocationId.x / UserRange[1] * UserRange[0]; + // + for (auto i = 0; i < Dims; ++i) + RoundedRange[i] = 1; + + static auto MultiplyingOverflows = [](size_t a, size_t b) { + if (a == 0 || b == 0) + return false; + return a > std::numeric_limits::max() / b; + }; + + // Default assume that making 1d range will work + DidAdjust = true; + auto RangeInnerIdx = Dims - 1; + for (auto i = RangeInnerIdx; i >= 0; --i) { + if (MultiplyingOverflows(RoundedRange[RangeInnerIdx], UserRange[i])) { + // Abort experimental range rounding if we cannot combine all dims into + // the inner dimension + RoundedRange = UserRange; + DidAdjust = false; + break; + } + RoundedRange[RangeInnerIdx] *= UserRange[i]; + } + + if (DidAdjust) { + // Round inner range up to the nearest GoodFactor + if (RoundedRange[RangeInnerIdx] % GoodFactor) { + RoundedRange[RangeInnerIdx] = + ((RoundedRange[RangeInnerIdx] / GoodFactor) + 1) * GoodFactor; + } + + if (this->RangeRoundingTrace()) { + std::cout << "parallel_for range adjusted using experimental range " + "rounding from "; + if constexpr (Dims == 1) + std::cout << "(" << UserRange[0] << ")"; + else if constexpr (Dims == 2) + std::cout << "(" << UserRange[0] << ", " << UserRange[1] << ")"; + else if constexpr (Dims == 3) + std::cout << "(" << UserRange[0] << ", " << UserRange[1] << ", " + << UserRange[2] << ")"; + + std::cout << " to 1D range: (" << RoundedRange[RangeInnerIdx] << ")" + << std::endl; + } + + bool HasBeenRounded = + RoundedRange[RangeInnerIdx] != UserRange[RangeInnerIdx]; + return {RoundedRange, HasBeenRounded}; + } +#endif // __SYCL_EXP_PARALLEL_FOR_RANGE_ROUNDING__ + // Perform range rounding if there are sufficient work-items to // need rounding and the user-specified range is not a multiple of // a "good" value. diff --git a/sycl/test-e2e/Basic/parallel_for_range_roundup.cpp b/sycl/test-e2e/Basic/parallel_for_range_roundup.cpp index b43421d80ca51..c2f594c9c6d72 100644 --- a/sycl/test-e2e/Basic/parallel_for_range_roundup.cpp +++ b/sycl/test-e2e/Basic/parallel_for_range_roundup.cpp @@ -5,6 +5,9 @@ // RUN: %{build} -fsycl-range-rounding=force -o %t.out // RUN: env SYCL_PARALLEL_FOR_RANGE_ROUNDING_TRACE=1 %{run} %t.out | FileCheck %s --check-prefix=CHECK-DEFAULT +// RUN: %{build} -fsycl-exp-range-rounding -o %t.out +// RUN: env SYCL_PARALLEL_FOR_RANGE_ROUNDING_TRACE=1 %{run} %t.out | FileCheck %s --check-prefix=CHECK-EXP +// // These tests test 3 things: // // 1. The user range is the same as the in kernel range (using BufRange) as @@ -243,3 +246,56 @@ int main() { // CHECK-DEFAULT-NEXT: Counter = 540672 // CHECK-DEFAULT-NEXT: Correct kernel indexes used // CHECK-DEFAULT-NEXT: Counter = 540672 + +// CHECK-EXP: parallel_for range adjusted using experimental range rounding from (1500) to 1D range: (1504) +// CHECK-EXP-NEXT: Size seen by user at Dim 0 = 1500 +// CHECK-EXP-NEXT: Counter = 1500 +// CHECK-EXP-NEXT: Correct kernel indexes used +// CHECK-EXP-NEXT: parallel_for range adjusted using experimental range rounding from (1500) to 1D range: (1504) +// CHECK-EXP-NEXT: Counter = 1500 +// CHECK-EXP-NEXT: Correct kernel indexes used +// CHECK-EXP-NEXT: parallel_for range adjusted using experimental range rounding from (1500, 33) to 1D range: (49504) +// CHECK-EXP-NEXT: Size seen by user at Dim 0 = 1500 +// CHECK-EXP-NEXT: Size seen by user at Dim 1 = 33 +// CHECK-EXP-NEXT: Counter = 49500 +// CHECK-EXP-NEXT: Correct kernel indexes used +// CHECK-EXP-NEXT: parallel_for range adjusted using experimental range rounding from (1500, 33) to 1D range: (49504) +// CHECK-EXP-NEXT: Counter = 49500 +// CHECK-EXP-NEXT: Correct kernel indexes used +// CHECK-EXP-NEXT: parallel_for range adjusted using experimental range rounding from (1500, 33, 64) to 1D range: (3168000) +// CHECK-EXP-NEXT: Size seen by user at Dim 0 = 1500 +// CHECK-EXP-NEXT: Size seen by user at Dim 1 = 33 +// CHECK-EXP-NEXT: Size seen by user at Dim 2 = 64 +// CHECK-EXP-NEXT: Counter = 3168000 +// CHECK-EXP-NEXT: Correct kernel indexes used +// CHECK-EXP-NEXT: parallel_for range adjusted using experimental range rounding from (1500, 33, 64) to 1D range: (3168000) +// CHECK-EXP-NEXT: Counter = 3168000 +// CHECK-EXP-NEXT: Correct kernel indexes used +// CHECK-EXP-NEXT: parallel_for range adjusted using experimental range rounding from (1500, 33, 64) to 1D range: (3168000) +// CHECK-EXP-NEXT: Counter = 3168000 +// CHECK-EXP-NEXT: parallel_for range adjusted using experimental range rounding from (256) to 1D range: (256) +// CHECK-EXP-NEXT: Size seen by user at Dim 0 = 256 +// CHECK-EXP-NEXT: Counter = 256 +// CHECK-EXP-NEXT: Correct kernel indexes used +// CHECK-EXP-NEXT: parallel_for range adjusted using experimental range rounding from (256) to 1D range: (256) +// CHECK-EXP-NEXT: Counter = 256 +// CHECK-EXP-NEXT: Correct kernel indexes used +// CHECK-EXP-NEXT: parallel_for range adjusted using experimental range rounding from (256, 33) to 1D range: (8448) +// CHECK-EXP-NEXT: Size seen by user at Dim 0 = 256 +// CHECK-EXP-NEXT: Size seen by user at Dim 1 = 33 +// CHECK-EXP-NEXT: Counter = 8448 +// CHECK-EXP-NEXT: Correct kernel indexes used +// CHECK-EXP-NEXT: parallel_for range adjusted using experimental range rounding from (256, 33) to 1D range: (8448) +// CHECK-EXP-NEXT: Counter = 8448 +// CHECK-EXP-NEXT: Correct kernel indexes used +// CHECK-EXP-NEXT: parallel_for range adjusted using experimental range rounding from (256, 33, 64) to 1D range: (540672) +// CHECK-EXP-NEXT: Size seen by user at Dim 0 = 256 +// CHECK-EXP-NEXT: Size seen by user at Dim 1 = 33 +// CHECK-EXP-NEXT: Size seen by user at Dim 2 = 64 +// CHECK-EXP-NEXT: Counter = 540672 +// CHECK-EXP-NEXT: Correct kernel indexes used +// CHECK-EXP-NEXT: parallel_for range adjusted using experimental range rounding from (256, 33, 64) to 1D range: (540672) +// CHECK-EXP-NEXT: Counter = 540672 +// CHECK-EXP-NEXT: Correct kernel indexes used +// CHECK-EXP-NEXT: parallel_for range adjusted using experimental range rounding from (256, 33, 64) to 1D range: (540672) +// CHECK-EXP-NEXT: Counter = 540672 From 4815f02e53ad287a663c6cd5d1455e17f7fd255f Mon Sep 17 00:00:00 2001 From: Hugh Delaney Date: Thu, 21 Mar 2024 16:55:42 +0000 Subject: [PATCH 2/9] Preserve the dimensionality of ranges In order to get better performance it is beneficial to preserve the dimensionality of the range. This new experimental range rounding does rounding in each dimension. The runtime can take suggestions on the size of the workgroup in all directions using SYCL_PARALLEL_FOR_RANGE_ROUNDING_PARAMS=x:y:z. In the case where -fsycl-exp-range-rounding is used, the middle param is the workgroup size in all dimensions, so for a 1d range kernel, the global range will divide {y}. In 2d the global range will be some number of workgroups of size {y, y}. The same for 3d with {y, y, y}. --- sycl/include/sycl/handler.hpp | 75 +++++-------------- .../Basic/parallel_for_range_roundup.cpp | 31 ++++---- 2 files changed, 36 insertions(+), 70 deletions(-) diff --git a/sycl/include/sycl/handler.hpp b/sycl/include/sycl/handler.hpp index 3bcfba5e9d0a4..7b09bda4ed49e 100644 --- a/sycl/include/sycl/handler.hpp +++ b/sycl/include/sycl/handler.hpp @@ -1242,66 +1242,28 @@ class __SYCL_EXPORT handler { }; #ifdef __SYCL_EXP_PARALLEL_FOR_RANGE_ROUNDING__ - // Experimental rounded range kernel will always make range 1d and will use - // the UserRange in kernel to calculate the indexes - // In kernel ID "getter" funcs will be calculated using UserRange: - // - // globalIDRounded: - // [0]: globalInvocationId.x % UserRange[0]; - // [1]: globalInvocationId.x / UserRange[0]; - // [2]: globalInvocationId.x / UserRange[1] * UserRange[0]; - // - for (auto i = 0; i < Dims; ++i) - RoundedRange[i] = 1; - - static auto MultiplyingOverflows = [](size_t a, size_t b) { - if (a == 0 || b == 0) - return false; - return a > std::numeric_limits::max() / b; - }; - - // Default assume that making 1d range will work - DidAdjust = true; - auto RangeInnerIdx = Dims - 1; - for (auto i = RangeInnerIdx; i >= 0; --i) { - if (MultiplyingOverflows(RoundedRange[RangeInnerIdx], UserRange[i])) { - // Abort experimental range rounding if we cannot combine all dims into - // the inner dimension - RoundedRange = UserRange; - DidAdjust = false; - break; - } - RoundedRange[RangeInnerIdx] *= UserRange[i]; + size_t GoodExpFactor = 1; + switch (Dims) { + case 1: + GoodExpFactor = 32; // Make global range multiple of {32} + break; + case 2: + GoodExpFactor = 16; // Make global range multiple of {16, 16} + break; + case 3: + GoodExpFactor = 8; // Make global range multiple of {8, 8, 8} + break; } - if (DidAdjust) { - // Round inner range up to the nearest GoodFactor - if (RoundedRange[RangeInnerIdx] % GoodFactor) { - RoundedRange[RangeInnerIdx] = - ((RoundedRange[RangeInnerIdx] / GoodFactor) + 1) * GoodFactor; - } + // Check if rounding parameters have been set through environment: + // SYCL_PARALLEL_FOR_RANGE_ROUNDING_PARAMS=MinRound:PreferredRound:MinRange + this->GetRangeRoundingSettings(MinFactorX, GoodExpFactor, MinRangeX); - if (this->RangeRoundingTrace()) { - std::cout << "parallel_for range adjusted using experimental range " - "rounding from "; - if constexpr (Dims == 1) - std::cout << "(" << UserRange[0] << ")"; - else if constexpr (Dims == 2) - std::cout << "(" << UserRange[0] << ", " << UserRange[1] << ")"; - else if constexpr (Dims == 3) - std::cout << "(" << UserRange[0] << ", " << UserRange[1] << ", " - << UserRange[2] << ")"; - - std::cout << " to 1D range: (" << RoundedRange[RangeInnerIdx] << ")" - << std::endl; + for (auto i = 0; i < Dims; ++i) + if (UserRange[i] % GoodExpFactor) { + Adjust(i, ((UserRange[i] / GoodExpFactor) + 1) * GoodExpFactor); } - - bool HasBeenRounded = - RoundedRange[RangeInnerIdx] != UserRange[RangeInnerIdx]; - return {RoundedRange, HasBeenRounded}; - } -#endif // __SYCL_EXP_PARALLEL_FOR_RANGE_ROUNDING__ - +#else // __SYCL_EXP_PARALLEL_FOR_RANGE_ROUNDING__ // Perform range rounding if there are sufficient work-items to // need rounding and the user-specified range is not a multiple of // a "good" value. @@ -1312,6 +1274,7 @@ class __SYCL_EXPORT handler { // will yield a rounded-up value for the total range. Adjust(0, ((RoundedRange[0] + GoodFactor - 1) / GoodFactor) * GoodFactor); } +#endif // __SYCL_EXP_PARALLEL_FOR_RANGE_ROUNDING__ #ifdef __SYCL_FORCE_PARALLEL_FOR_RANGE_ROUNDING__ // If we are forcing range rounding kernels to be used, we always want the // rounded range kernel to be generated, even if rounding isn't needed diff --git a/sycl/test-e2e/Basic/parallel_for_range_roundup.cpp b/sycl/test-e2e/Basic/parallel_for_range_roundup.cpp index c2f594c9c6d72..420ebdbbf1e50 100644 --- a/sycl/test-e2e/Basic/parallel_for_range_roundup.cpp +++ b/sycl/test-e2e/Basic/parallel_for_range_roundup.cpp @@ -247,55 +247,58 @@ int main() { // CHECK-DEFAULT-NEXT: Correct kernel indexes used // CHECK-DEFAULT-NEXT: Counter = 540672 -// CHECK-EXP: parallel_for range adjusted using experimental range rounding from (1500) to 1D range: (1504) +// CHECK-EXP: parallel_for range adjusted at dim 0 from 1500 to 1504 // CHECK-EXP-NEXT: Size seen by user at Dim 0 = 1500 // CHECK-EXP-NEXT: Counter = 1500 // CHECK-EXP-NEXT: Correct kernel indexes used -// CHECK-EXP-NEXT: parallel_for range adjusted using experimental range rounding from (1500) to 1D range: (1504) +// CHECK-EXP-NEXT: parallel_for range adjusted at dim 0 from 1500 to 1504 // CHECK-EXP-NEXT: Counter = 1500 // CHECK-EXP-NEXT: Correct kernel indexes used -// CHECK-EXP-NEXT: parallel_for range adjusted using experimental range rounding from (1500, 33) to 1D range: (49504) +// CHECK-EXP-NEXT: parallel_for range adjusted at dim 0 from 1500 to 1504 +// CHECK-EXP-NEXT: parallel_for range adjusted at dim 1 from 33 to 48 // CHECK-EXP-NEXT: Size seen by user at Dim 0 = 1500 // CHECK-EXP-NEXT: Size seen by user at Dim 1 = 33 // CHECK-EXP-NEXT: Counter = 49500 // CHECK-EXP-NEXT: Correct kernel indexes used -// CHECK-EXP-NEXT: parallel_for range adjusted using experimental range rounding from (1500, 33) to 1D range: (49504) +// CHECK-EXP-NEXT: parallel_for range adjusted at dim 0 from 1500 to 1504 +// CHECK-EXP-NEXT: parallel_for range adjusted at dim 1 from 33 to 48 // CHECK-EXP-NEXT: Counter = 49500 // CHECK-EXP-NEXT: Correct kernel indexes used -// CHECK-EXP-NEXT: parallel_for range adjusted using experimental range rounding from (1500, 33, 64) to 1D range: (3168000) +// CHECK-EXP-NEXT: parallel_for range adjusted at dim 0 from 1500 to 1504 +// CHECK-EXP-NEXT: parallel_for range adjusted at dim 1 from 33 to 40 // CHECK-EXP-NEXT: Size seen by user at Dim 0 = 1500 // CHECK-EXP-NEXT: Size seen by user at Dim 1 = 33 // CHECK-EXP-NEXT: Size seen by user at Dim 2 = 64 // CHECK-EXP-NEXT: Counter = 3168000 // CHECK-EXP-NEXT: Correct kernel indexes used -// CHECK-EXP-NEXT: parallel_for range adjusted using experimental range rounding from (1500, 33, 64) to 1D range: (3168000) +// CHECK-EXP-NEXT: parallel_for range adjusted at dim 0 from 1500 to 1504 +// CHECK-EXP-NEXT: parallel_for range adjusted at dim 1 from 33 to 40 // CHECK-EXP-NEXT: Counter = 3168000 // CHECK-EXP-NEXT: Correct kernel indexes used -// CHECK-EXP-NEXT: parallel_for range adjusted using experimental range rounding from (1500, 33, 64) to 1D range: (3168000) +// CHECK-EXP-NEXT: parallel_for range adjusted at dim 0 from 1500 to 1504 +// CHECK-EXP-NEXT: parallel_for range adjusted at dim 1 from 33 to 40 // CHECK-EXP-NEXT: Counter = 3168000 -// CHECK-EXP-NEXT: parallel_for range adjusted using experimental range rounding from (256) to 1D range: (256) // CHECK-EXP-NEXT: Size seen by user at Dim 0 = 256 // CHECK-EXP-NEXT: Counter = 256 // CHECK-EXP-NEXT: Correct kernel indexes used -// CHECK-EXP-NEXT: parallel_for range adjusted using experimental range rounding from (256) to 1D range: (256) // CHECK-EXP-NEXT: Counter = 256 // CHECK-EXP-NEXT: Correct kernel indexes used -// CHECK-EXP-NEXT: parallel_for range adjusted using experimental range rounding from (256, 33) to 1D range: (8448) +// CHECK-EXP-NEXT: parallel_for range adjusted at dim 1 from 33 to 48 // CHECK-EXP-NEXT: Size seen by user at Dim 0 = 256 // CHECK-EXP-NEXT: Size seen by user at Dim 1 = 33 // CHECK-EXP-NEXT: Counter = 8448 // CHECK-EXP-NEXT: Correct kernel indexes used -// CHECK-EXP-NEXT: parallel_for range adjusted using experimental range rounding from (256, 33) to 1D range: (8448) +// CHECK-EXP-NEXT: parallel_for range adjusted at dim 1 from 33 to 48 // CHECK-EXP-NEXT: Counter = 8448 // CHECK-EXP-NEXT: Correct kernel indexes used -// CHECK-EXP-NEXT: parallel_for range adjusted using experimental range rounding from (256, 33, 64) to 1D range: (540672) +// CHECK-EXP-NEXT: parallel_for range adjusted at dim 1 from 33 to 40 // CHECK-EXP-NEXT: Size seen by user at Dim 0 = 256 // CHECK-EXP-NEXT: Size seen by user at Dim 1 = 33 // CHECK-EXP-NEXT: Size seen by user at Dim 2 = 64 // CHECK-EXP-NEXT: Counter = 540672 // CHECK-EXP-NEXT: Correct kernel indexes used -// CHECK-EXP-NEXT: parallel_for range adjusted using experimental range rounding from (256, 33, 64) to 1D range: (540672) +// CHECK-EXP-NEXT: parallel_for range adjusted at dim 1 from 33 to 40 // CHECK-EXP-NEXT: Counter = 540672 // CHECK-EXP-NEXT: Correct kernel indexes used -// CHECK-EXP-NEXT: parallel_for range adjusted using experimental range rounding from (256, 33, 64) to 1D range: (540672) +// CHECK-EXP-NEXT: parallel_for range adjusted at dim 1 from 33 to 40 // CHECK-EXP-NEXT: Counter = 540672 From 964979729408db4306bd654ef64f8b80ab279430 Mon Sep 17 00:00:00 2001 From: Hugh Delaney Date: Thu, 21 Mar 2024 17:31:53 +0000 Subject: [PATCH 3/9] Add documentation for exp range rounding Exp range rounding can also be used with the env var: SYCL_PARALLEL_FOR_RANGE_ROUNDING_PARAMS. --- sycl/doc/design/ParallelForRangeRounding.md | 29 +++++++++++++++++++++ 1 file changed, 29 insertions(+) diff --git a/sycl/doc/design/ParallelForRangeRounding.md b/sycl/doc/design/ParallelForRangeRounding.md index 7f43cafe6e96e..85bd1faa7cdc9 100644 --- a/sycl/doc/design/ParallelForRangeRounding.md +++ b/sycl/doc/design/ParallelForRangeRounding.md @@ -47,3 +47,32 @@ the range rounded kernel, `-fsycl-range-rounding=force`. The user can also tell the SYCL implementation to only produce the unrounded kernel using the flag `-fsycl-range-rounding=disable`. By default both kernels will be generated, which is equivalent to `-fsycl-range-rounding=on`. + +## Experimental Range Rounding + +Experimental range rounding will perform rounding in all dimensions. +Experimental range rounding can be set using the `-fsycl-exp-range-rounding` +flag. + +Some oddly shaped ranges and how they might round: + +``` +{43} -> {64} +{43, 79} -> {64, 96} +{43, 79, 7} -> {64, 96, 8} +``` + +The user can specify the factor that they want the rounded range to be a +multiple of in all dimensions using the +`SYCL_PARALLEL_FOR_RANGE_ROUNDING_PARAMS` environment variable. When +experimental range rounding is used, only the middle value in +`SYCL_PARALLEL_FOR_RANGE_ROUNDING_PARAMS` is used. +If `SYCL_PARALLEL_FOR_RANGE_ROUNDING_PARAMS` is set to `1:256:1`, the rounded +range will divide `256` in all dimensions + +``` +{43} -> {256} +{43, 257} -> {256, 512} +{43, 257, 7} -> {256, 512, 256} +``` + From e324b36f13b41fbcefd8c8e0d6c312f1b39d429a Mon Sep 17 00:00:00 2001 From: Hugh Delaney Date: Fri, 22 Mar 2024 12:15:17 +0000 Subject: [PATCH 4/9] Add combined range rounding flags to test Adds the test case where -fsycl-range-rounding=force is used together with -fsycl-exp-range-rounding. This ensures that flags do not interfere with eachother. --- sycl/test-e2e/Basic/parallel_for_range_roundup.cpp | 3 +++ 1 file changed, 3 insertions(+) diff --git a/sycl/test-e2e/Basic/parallel_for_range_roundup.cpp b/sycl/test-e2e/Basic/parallel_for_range_roundup.cpp index 420ebdbbf1e50..be26b67986f36 100644 --- a/sycl/test-e2e/Basic/parallel_for_range_roundup.cpp +++ b/sycl/test-e2e/Basic/parallel_for_range_roundup.cpp @@ -7,6 +7,9 @@ // RUN: %{build} -fsycl-exp-range-rounding -o %t.out // RUN: env SYCL_PARALLEL_FOR_RANGE_ROUNDING_TRACE=1 %{run} %t.out | FileCheck %s --check-prefix=CHECK-EXP + +// RUN: %{build} -fsycl-range-rounding=force -fsycl-exp-range-rounding -o %t.out +// RUN: env SYCL_PARALLEL_FOR_RANGE_ROUNDING_TRACE=1 %{run} %t.out | FileCheck %s --check-prefix=CHECK-EXP // // These tests test 3 things: // From 6f850d02d2fdf63493e1f5b10affc51b0e995e57 Mon Sep 17 00:00:00 2001 From: Hugh Delaney Date: Fri, 22 Mar 2024 12:28:30 +0000 Subject: [PATCH 5/9] Fix lint --- sycl/include/sycl/handler.hpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/sycl/include/sycl/handler.hpp b/sycl/include/sycl/handler.hpp index 7b09bda4ed49e..353cde70e8bf9 100644 --- a/sycl/include/sycl/handler.hpp +++ b/sycl/include/sycl/handler.hpp @@ -1263,7 +1263,7 @@ class __SYCL_EXPORT handler { if (UserRange[i] % GoodExpFactor) { Adjust(i, ((UserRange[i] / GoodExpFactor) + 1) * GoodExpFactor); } -#else // __SYCL_EXP_PARALLEL_FOR_RANGE_ROUNDING__ +#else // Perform range rounding if there are sufficient work-items to // need rounding and the user-specified range is not a multiple of // a "good" value. From bf66eb566ddfba43fdbfee464d3df4a00f174023 Mon Sep 17 00:00:00 2001 From: Hugh Delaney Date: Fri, 22 Mar 2024 16:27:53 +0000 Subject: [PATCH 6/9] Add test to PerformanceTests Add test that compares the performance of no range rounding, normal range rounding and experimental range rounding. --- .../PerformanceTests/ParallelFor/a.out | Bin 0 -> 206448 bytes .../parallel_for_range_roundup.cpp | 66 ++++++++++++++++++ 2 files changed, 66 insertions(+) create mode 100755 sycl/test-e2e/PerformanceTests/ParallelFor/a.out create mode 100644 sycl/test-e2e/PerformanceTests/ParallelFor/parallel_for_range_roundup.cpp diff --git a/sycl/test-e2e/PerformanceTests/ParallelFor/a.out b/sycl/test-e2e/PerformanceTests/ParallelFor/a.out new file mode 100755 index 0000000000000000000000000000000000000000..0dd972d2830e0349caccb9ec8346b79f0b970d2c GIT binary patch literal 206448 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 +#include +#include + +class FillData; +class Compute; + +int main() { + constexpr static size_t width{788}; + constexpr static size_t height{1888}; + constexpr static size_t N{width * height}; + constexpr static size_t iterations{1000}; + + sycl::queue q{}; + float *A{sycl::malloc_device(N, q)}; + float *B{sycl::malloc_device(N, q)}; + float *C{sycl::malloc_device(N, q)}; + + q.submit([&](sycl::handler &cgh) { + cgh.parallel_for( + sycl::range<2>{height, width}, [=](sycl::id<2> id) { + unsigned int row{static_cast(id[0])}; + unsigned int col{static_cast(id[1])}; + unsigned int ix{row * static_cast(width) + col}; + A[ix] = id[0]; + B[ix] = id[1]; + }); + }).wait_and_throw(); + + auto start{std::chrono::steady_clock::now()}; + for (size_t i{0}; i < iterations; ++i) { + q.submit([&](sycl::handler &cgh) { + cgh.parallel_for( + sycl::range<2>{height, width}, [=](sycl::id<2> id) { + unsigned int row{static_cast(id[0])}; + unsigned int col{static_cast(id[1])}; + unsigned int ix{row * static_cast(width) + col}; + if (ix >= static_cast(N)) { + return; + } + if (A[ix] > B[ix]) { + C[ix] = A[ix]; + } else { + C[ix] = B[ix]; + } + }); + }).wait_and_throw(); + } + auto end{std::chrono::steady_clock::now()}; + std::cout << std::chrono::duration_cast(end - + start) + .count() + << " ms" << std::endl; +} From 7e4082ba42f0e0be0d5355df35356f632d2b70de Mon Sep 17 00:00:00 2001 From: Hugh Delaney Date: Fri, 22 Mar 2024 16:31:58 +0000 Subject: [PATCH 7/9] Update docs Clarify that disabling range rounding will override experimental range rounding. --- sycl/doc/design/ParallelForRangeRounding.md | 3 +++ 1 file changed, 3 insertions(+) diff --git a/sycl/doc/design/ParallelForRangeRounding.md b/sycl/doc/design/ParallelForRangeRounding.md index 85bd1faa7cdc9..3575200fd4535 100644 --- a/sycl/doc/design/ParallelForRangeRounding.md +++ b/sycl/doc/design/ParallelForRangeRounding.md @@ -76,3 +76,6 @@ range will divide `256` in all dimensions {43, 257, 7} -> {256, 512, 256} ``` +`-fsycl-range-rounding=disable` will override `-fsycl-exp-range-rounding`. If +both are used in conjunction then no range rounding will happen. + From b0d5765f78fe4fde36b56a0b5dd9575611a60bf6 Mon Sep 17 00:00:00 2001 From: Hugh Delaney Date: Fri, 22 Mar 2024 16:33:41 +0000 Subject: [PATCH 8/9] Remove a.out --- .../PerformanceTests/ParallelFor/a.out | Bin 206448 -> 0 bytes 1 file changed, 0 insertions(+), 0 deletions(-) delete mode 100755 sycl/test-e2e/PerformanceTests/ParallelFor/a.out diff --git a/sycl/test-e2e/PerformanceTests/ParallelFor/a.out b/sycl/test-e2e/PerformanceTests/ParallelFor/a.out deleted file mode 100755 index 0dd972d2830e0349caccb9ec8346b79f0b970d2c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 206448 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 Date: Fri, 22 Mar 2024 16:43:32 +0000 Subject: [PATCH 9/9] Add clang test Check for the presence of macro __SYCL_EXP_PARALLEL_FOR_RANGE_ROUNDING__ when using -fsycl-exp-range-rounding. --- clang/test/Preprocessor/predefined-macros.c | 28 +++++++++++++++++++++ 1 file changed, 28 insertions(+) diff --git a/clang/test/Preprocessor/predefined-macros.c b/clang/test/Preprocessor/predefined-macros.c index 199fd03bee63b..b902e15043cb9 100644 --- a/clang/test/Preprocessor/predefined-macros.c +++ b/clang/test/Preprocessor/predefined-macros.c @@ -339,6 +339,34 @@ // CHECK-FORCE-RANGE: #define __SYCL_FORCE_PARALLEL_FOR_RANGE_ROUNDING__ 1 // CHECK-FORCE-NO-RANGE-NOT: #define __SYCL_FORCE_PARALLEL_FOR_RANGE_ROUNDING__ 1 +// RUN: %clang_cc1 %s -E -dM -fsycl-is-device \ +// RUN: -triple spir64-unknown-unknown -fsycl-exp-range-rounding -o - \ +// RUN: | FileCheck -match-full-lines %s --check-prefix=CHECK-EXP-RANGE + +// RUN: %clang_cc1 %s -E -dM -fsycl-is-device \ +// RUN: -triple spir64_fpga-unknown-unknown -o - \ +// RUN: | FileCheck -match-full-lines %s --check-prefix=CHECK-EXP-NO-RANGE + +// RUN: %clang_cc1 %s -E -dM -fsycl-is-device -fsycl-exp-range-rounding \ +// RUN: -triple spir64_fpga-unknown-unknown -o - \ +// RUN: | FileCheck -match-full-lines %s --check-prefix=CHECK-EXP-RANGE + +// RUN: %clang_cc1 %s -E -dM -fsycl-is-device -o - \ +// RUN: | FileCheck -match-full-lines %s --check-prefix=CHECK-EXP-NO-RANGE + +// RUN: %clang_cc1 %s -E -dM -o - \ +// RUN: | FileCheck -match-full-lines %s --check-prefix=CHECK-EXP-NO-RANGE + +// RUN: %clang_cc1 %s -E -dM -fsycl-is-host \ +// RUN: -triple x86_64-unknown-linux-gnu -fsycl-exp-range-rounding -o - \ +// RUN: | FileCheck -match-full-lines %s --check-prefix=CHECK-EXP-RANGE + +// RUN: %clang_cc1 %s -E -dM -fsycl-is-host -o - \ +// RUN: | FileCheck -match-full-lines %s --check-prefix=CHECK-EXP-NO-RANGE + +// CHECK-EXP-RANGE: #define __SYCL_EXP_PARALLEL_FOR_RANGE_ROUNDING__ 1 +// CHECK-EXP-NO-RANGE-NOT: #define __SYCL_EXP_PARALLEL_FOR_RANGE_ROUNDING__ 1 + // RUN: %clang_cc1 %s -E -dM -o - -x hip -triple x86_64-unknown-linux-gnu \ // RUN: -fgpu-default-stream=per-thread \ // RUN: | FileCheck -match-full-lines %s --check-prefix=CHECK-PTH