summaryrefslogtreecommitdiff
path: root/src/kernels/common.opencl
diff options
context:
space:
mode:
Diffstat (limited to 'src/kernels/common.opencl')
-rw-r--r--src/kernels/common.opencl26
1 files changed, 26 insertions, 0 deletions
diff --git a/src/kernels/common.opencl b/src/kernels/common.opencl
index 01605f6e..08c47d87 100644
--- a/src/kernels/common.opencl
+++ b/src/kernels/common.opencl
@@ -192,6 +192,32 @@ R"(
// =================================================================================================
+// Shuffled workgroup indices to avoid partition camping, see below. For specific devices, this is
+// enabled (see src/routine.cc).
+#ifndef USE_STAGGERED_INDICES
+ #define USE_STAGGERED_INDICES 0
+#endif
+
+// Staggered/shuffled group indices to avoid partition camping (AMD GPUs). Formula's are taken from:
+// http://docs.nvidia.com/cuda/samples/6_Advanced/transpose/doc/MatrixTranspose.pdf
+// More details: https://github.com/CNugteren/CLBlast/issues/53
+#if USE_STAGGERED_INDICES == 1
+ inline size_t GetGroupIDFlat() {
+ return get_group_id(0) + get_num_groups(0) * get_group_id(1);
+ }
+ inline size_t GetGroupID1() {
+ return (GetGroupIDFlat()) % get_num_groups(1);
+ }
+ inline size_t GetGroupID0() {
+ return ((GetGroupIDFlat() / get_num_groups(1)) + GetGroupID1()) % get_num_groups(0);
+ }
+#else
+ inline size_t GetGroupID1() { return get_group_id(1); }
+ inline size_t GetGroupID0() { return get_group_id(0); }
+#endif
+
+// =================================================================================================
+
// End of the C++11 raw string literal
)"