From 73f49e9b3d4abc4214122e4b8c07a736e01626ee Mon Sep 17 00:00:00 2001 From: "Angus, Alexander" Date: Tue, 17 Jan 2023 08:35:29 -0800 Subject: [PATCH] Updated according to feedback from CNugteren --- Adreno_730_tuning_results.zip | Bin 59988 -> 0 bytes Adreno_740_tuning_results.zip | Bin 59507 -> 0 bytes CHANGELOG | 5 +++++ README.md | 2 -- src/kernels/level1/xamax.opencl | 4 ++-- src/kernels/level1/xasum.opencl | 4 ++-- src/kernels/level1/xaxpy.opencl | 8 ++++---- src/kernels/level1/xcopy.opencl | 4 ++-- src/kernels/level1/xdot.opencl | 4 ++-- src/kernels/level1/xhad.opencl | 6 +++--- src/kernels/level1/xnrm2.opencl | 4 ++-- src/kernels/level1/xscal.opencl | 4 ++-- src/kernels/level1/xswap.opencl | 4 ++-- src/kernels/level2/xgemv.opencl | 2 +- src/kernels/level2/xgemv_fast.opencl | 4 ++-- src/kernels/level2/xger.opencl | 2 +- src/kernels/level2/xher.opencl | 2 +- src/kernels/level2/xher2.opencl | 2 +- src/kernels/level2/xtrsv.opencl | 4 ++-- src/kernels/level3/convert_hermitian.opencl | 4 ++-- src/kernels/level3/convert_symmetric.opencl | 4 ++-- src/kernels/level3/convert_triangular.opencl | 4 ++-- src/kernels/level3/copy_fast.opencl | 2 +- src/kernels/level3/copy_pad.opencl | 12 ++++++------ .../level3/invert_diagonal_blocks_part1.opencl | 2 +- src/kernels/level3/transpose_fast.opencl | 2 +- src/kernels/level3/transpose_pad.opencl | 12 ++++++------ src/kernels/level3/xgemm_batched.opencl | 4 ++-- src/kernels/level3/xgemm_direct_batched.opencl | 16 ++++++++-------- src/kernels/level3/xgemm_direct_part3.opencl | 8 ++++---- src/kernels/level3/xgemm_part4.opencl | 6 +++--- src/kernels/levelx/col2im.opencl | 4 ++-- src/kernels/levelx/im2col.opencl | 4 ++-- src/kernels/levelx/xconvgemm_part2.opencl | 6 +++--- src/utilities/compile.cpp | 4 ++-- src/utilities/utilities.cpp | 2 +- 36 files changed, 82 insertions(+), 79 deletions(-) delete mode 100644 Adreno_730_tuning_results.zip delete mode 100644 Adreno_740_tuning_results.zip diff --git a/Adreno_730_tuning_results.zip b/Adreno_730_tuning_results.zip deleted file mode 100644 index 6fa29af58f9e2c47e680f407c048759727ee8f79..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 59988 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 diff --git a/Adreno_740_tuning_results.zip b/Adreno_740_tuning_results.zip deleted file mode 100644 index 6a5622b83682b1f0fbf538c07ce171090a41358d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 59507 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 EA5kLG4gdfE diff --git a/CHANGELOG b/CHANGELOG index 7088fb49..824f4520 100644 --- a/CHANGELOG +++ b/CHANGELOG @@ -1,5 +1,10 @@ Development version (next version) - Fixes two small issues in the plotting script +- Modifications to improve performance on Qualcomm Adreno GPUs: + * Unique database entries for specific Adreno devices + * Toggle OpenCL kernel compilation options for Adreno + * New preprocessor directive RELAX_WORKGROUP_SIZE +- Fixed a bug in handling of #undef in CLBlast loop unrolling and array-to-register mapping functions Version 1.5.3 - Fix a correctness issue with DGEMM on SM 7.5 Turing GPUs diff --git a/README.md b/README.md index 834d6221..cbecc606 100644 --- a/README.md +++ b/README.md @@ -101,8 +101,6 @@ Known performance related issues: * Severe performance issues with Beignet v1.3.0 due to missing support for local memory. Please downgrade to v1.2.1 or upgrade to v1.3.1 or newer. -* Performance issues on Qualcomm Adreno GPUs. - Other known issues: * Routines returning an integer are currently not properly tested for half-precision FP16: IHAMAX/IHAMIN/IHMAX/IHMIN diff --git a/src/kernels/level1/xamax.opencl b/src/kernels/level1/xamax.opencl index 3600b9d2..06a6773b 100644 --- a/src/kernels/level1/xamax.opencl +++ b/src/kernels/level1/xamax.opencl @@ -32,7 +32,7 @@ R"( // The main reduction kernel, performing the loading and the majority of the operation #if RELAX_WORKGROUP_SIZE == 1 __kernel -#elif +#else __kernel __attribute__((reqd_work_group_size(WGS1, 1, 1))) #endif void Xamax(const int n, @@ -102,7 +102,7 @@ void Xamax(const int n, // be launched with a single workgroup only. #if RELAX_WORKGROUP_SIZE == 1 __kernel -#elif +#else __kernel __attribute__((reqd_work_group_size(WGS2, 1, 1))) #endif void XamaxEpilogue(const __global singlereal* restrict maxgm, diff --git a/src/kernels/level1/xasum.opencl b/src/kernels/level1/xasum.opencl index 875221f4..683c6fad 100644 --- a/src/kernels/level1/xasum.opencl +++ b/src/kernels/level1/xasum.opencl @@ -32,7 +32,7 @@ R"( // The main reduction kernel, performing the loading and the majority of the operation #if RELAX_WORKGROUP_SIZE == 1 __kernel -#elif +#else __kernel __attribute__((reqd_work_group_size(WGS1, 1, 1))) #endif void Xasum(const int n, @@ -79,7 +79,7 @@ void Xasum(const int n, // be launched with a single workgroup only. #if RELAX_WORKGROUP_SIZE == 1 __kernel -#elif +#else __kernel __attribute__((reqd_work_group_size(WGS2, 1, 1))) #endif void XasumEpilogue(const __global real* restrict input, diff --git a/src/kernels/level1/xaxpy.opencl b/src/kernels/level1/xaxpy.opencl index b20ad200..a106ed01 100644 --- a/src/kernels/level1/xaxpy.opencl +++ b/src/kernels/level1/xaxpy.opencl @@ -24,7 +24,7 @@ R"( // Full version of the kernel with offsets and strided accesses #if RELAX_WORKGROUP_SIZE == 1 __kernel -#elif +#else __kernel __attribute__((reqd_work_group_size(WGS, 1, 1))) #endif void Xaxpy(const int n, const real_arg arg_alpha, @@ -43,7 +43,7 @@ void Xaxpy(const int n, const real_arg arg_alpha, // assumes that 'n' is dividable by 'VW' and 'WPT'. #if RELAX_WORKGROUP_SIZE == 1 __kernel -#elif +#else __kernel __attribute__((reqd_work_group_size(WGS, 1, 1))) #endif void XaxpyFaster(const int n, const real_arg arg_alpha, @@ -67,7 +67,7 @@ void XaxpyFaster(const int n, const real_arg arg_alpha, // dividable by 'VW', 'WGS' and 'WPT'. #if RELAX_WORKGROUP_SIZE == 1 __kernel -#elif +#else __kernel __attribute__((reqd_work_group_size(WGS, 1, 1))) #endif void XaxpyFastest(const int n, const real_arg arg_alpha, @@ -89,7 +89,7 @@ void XaxpyFastest(const int n, const real_arg arg_alpha, // Full version of the kernel with offsets and strided accesses: batched version #if RELAX_WORKGROUP_SIZE == 1 __kernel -#elif +#else __kernel __attribute__((reqd_work_group_size(WGS, 1, 1))) #endif void XaxpyBatched(const int n, const __constant real_arg* arg_alphas, diff --git a/src/kernels/level1/xcopy.opencl b/src/kernels/level1/xcopy.opencl index 174bf0c6..493197af 100644 --- a/src/kernels/level1/xcopy.opencl +++ b/src/kernels/level1/xcopy.opencl @@ -24,7 +24,7 @@ R"( // Full version of the kernel with offsets and strided accesses #if RELAX_WORKGROUP_SIZE == 1 __kernel -#elif +#else __kernel __attribute__((reqd_work_group_size(WGS, 1, 1))) #endif void Xcopy(const int n, @@ -43,7 +43,7 @@ void Xcopy(const int n, // dividable by 'VW', 'WGS' and 'WPT'. #if RELAX_WORKGROUP_SIZE == 1 __kernel -#elif +#else __kernel __attribute__((reqd_work_group_size(WGS, 1, 1))) #endif void XcopyFast(const int n, diff --git a/src/kernels/level1/xdot.opencl b/src/kernels/level1/xdot.opencl index e14b6306..64f6eb9d 100644 --- a/src/kernels/level1/xdot.opencl +++ b/src/kernels/level1/xdot.opencl @@ -32,7 +32,7 @@ R"( // The main reduction kernel, performing the multiplication and the majority of the sum operation #if RELAX_WORKGROUP_SIZE == 1 __kernel -#elif +#else __kernel __attribute__((reqd_work_group_size(WGS1, 1, 1))) #endif void Xdot(const int n, @@ -78,7 +78,7 @@ void Xdot(const int n, // be launched with a single workgroup only. #if RELAX_WORKGROUP_SIZE == 1 __kernel -#elif +#else __kernel __attribute__((reqd_work_group_size(WGS2, 1, 1))) #endif void XdotEpilogue(const __global real* restrict input, diff --git a/src/kernels/level1/xhad.opencl b/src/kernels/level1/xhad.opencl index aee98f91..47bb5170 100644 --- a/src/kernels/level1/xhad.opencl +++ b/src/kernels/level1/xhad.opencl @@ -68,7 +68,7 @@ INLINE_FUNC realV MultiplyVectorVector(realV cvec, const realV aval, const realV // Full version of the kernel with offsets and strided accesses #if RELAX_WORKGROUP_SIZE == 1 __kernel -#elif +#else __kernel __attribute__((reqd_work_group_size(WGS, 1, 1))) #endif void Xhad(const int n, const real_arg arg_alpha, const real_arg arg_beta, @@ -96,7 +96,7 @@ void Xhad(const int n, const real_arg arg_alpha, const real_arg arg_beta, // assumes that 'n' is dividable by 'VW' and 'WPT'. #if RELAX_WORKGROUP_SIZE == 1 __kernel -#elif +#else __kernel __attribute__((reqd_work_group_size(WGS, 1, 1))) #endif void XhadFaster(const int n, const real_arg arg_alpha, const real_arg arg_beta, @@ -127,7 +127,7 @@ void XhadFaster(const int n, const real_arg arg_alpha, const real_arg arg_beta, // dividable by 'VW', 'WGS' and 'WPT'. #if RELAX_WORKGROUP_SIZE == 1 __kernel -#elif +#else __kernel __attribute__((reqd_work_group_size(WGS, 1, 1))) #endif void XhadFastest(const int n, const real_arg arg_alpha, const real_arg arg_beta, diff --git a/src/kernels/level1/xnrm2.opencl b/src/kernels/level1/xnrm2.opencl index fb45effb..36ea49b4 100644 --- a/src/kernels/level1/xnrm2.opencl +++ b/src/kernels/level1/xnrm2.opencl @@ -32,7 +32,7 @@ R"( // The main reduction kernel, performing the multiplication and the majority of the operation #if RELAX_WORKGROUP_SIZE == 1 __kernel -#elif +#else __kernel __attribute__((reqd_work_group_size(WGS1, 1, 1))) #endif void Xnrm2(const int n, @@ -77,7 +77,7 @@ void Xnrm2(const int n, // be launched with a single workgroup only. #if RELAX_WORKGROUP_SIZE == 1 __kernel -#elif +#else __kernel __attribute__((reqd_work_group_size(WGS2, 1, 1))) #endif void Xnrm2Epilogue(const __global real* restrict input, diff --git a/src/kernels/level1/xscal.opencl b/src/kernels/level1/xscal.opencl index 19ca9135..e4260c7c 100644 --- a/src/kernels/level1/xscal.opencl +++ b/src/kernels/level1/xscal.opencl @@ -24,7 +24,7 @@ R"( // Full version of the kernel with offsets and strided accesses #if RELAX_WORKGROUP_SIZE == 1 __kernel -#elif +#else __kernel __attribute__((reqd_work_group_size(WGS, 1, 1))) #endif void Xscal(const int n, const real_arg arg_alpha, @@ -46,7 +46,7 @@ void Xscal(const int n, const real_arg arg_alpha, // dividable by 'VW', 'WGS' and 'WPT'. #if RELAX_WORKGROUP_SIZE == 1 __kernel -#elif +#else __kernel __attribute__((reqd_work_group_size(WGS, 1, 1))) #endif void XscalFast(const int n, const real_arg arg_alpha, diff --git a/src/kernels/level1/xswap.opencl b/src/kernels/level1/xswap.opencl index a2b44de3..2d384423 100644 --- a/src/kernels/level1/xswap.opencl +++ b/src/kernels/level1/xswap.opencl @@ -24,7 +24,7 @@ R"( // Full version of the kernel with offsets and strided accesses #if RELAX_WORKGROUP_SIZE == 1 __kernel -#elif +#else __kernel __attribute__((reqd_work_group_size(WGS, 1, 1))) #endif void Xswap(const int n, @@ -45,7 +45,7 @@ void Xswap(const int n, // dividable by 'VW', 'WGS' and 'WPT'. #if RELAX_WORKGROUP_SIZE == 1 __kernel -#elif +#else __kernel __attribute__((reqd_work_group_size(WGS, 1, 1))) #endif void XswapFast(const int n, diff --git a/src/kernels/level2/xgemv.opencl b/src/kernels/level2/xgemv.opencl index 16711aa4..15912a60 100644 --- a/src/kernels/level2/xgemv.opencl +++ b/src/kernels/level2/xgemv.opencl @@ -212,7 +212,7 @@ INLINE_FUNC real LoadMatrixA(const __global real* restrict agm, const int x, con // Full version of the kernel #if RELAX_WORKGROUP_SIZE == 1 __kernel -#elif +#else __kernel __attribute__((reqd_work_group_size(WGS1, 1, 1))) #endif void Xgemv(const int m, const int n, diff --git a/src/kernels/level2/xgemv_fast.opencl b/src/kernels/level2/xgemv_fast.opencl index 853d3d28..46087af7 100644 --- a/src/kernels/level2/xgemv_fast.opencl +++ b/src/kernels/level2/xgemv_fast.opencl @@ -90,7 +90,7 @@ INLINE_FUNC realVF LoadMatrixAVF(const __global realVF* restrict agm, const int // --> 'do_conjugate' is 0 #if RELAX_WORKGROUP_SIZE == 1 __kernel -#elif +#else __kernel __attribute__((reqd_work_group_size(WGS2, 1, 1))) #endif void XgemvFast(const int m, const int n, @@ -197,7 +197,7 @@ void XgemvFast(const int m, const int n, // --> 'do_conjugate' is 0 #if RELAX_WORKGROUP_SIZE == 1 __kernel -#elif +#else __kernel __attribute__((reqd_work_group_size(WGS3, 1, 1))) #endif void XgemvFastRot(const int m, const int n, diff --git a/src/kernels/level2/xger.opencl b/src/kernels/level2/xger.opencl index 3620c66a..b1fe8447 100644 --- a/src/kernels/level2/xger.opencl +++ b/src/kernels/level2/xger.opencl @@ -20,7 +20,7 @@ R"( // Regular version of the rank-1 matrix update kernel (GER, GERU, GERC) #if RELAX_WORKGROUP_SIZE == 1 __kernel -#elif +#else __kernel __attribute__((reqd_work_group_size(WGS1, WGS2, 1))) #endif void Xger(const int max1, const int max2, diff --git a/src/kernels/level2/xher.opencl b/src/kernels/level2/xher.opencl index 9e460cd4..eac8c10a 100644 --- a/src/kernels/level2/xher.opencl +++ b/src/kernels/level2/xher.opencl @@ -20,7 +20,7 @@ R"( // Symmetric version of the rank-1 matrix update kernel (HER, HPR, SYR, SPR) #if RELAX_WORKGROUP_SIZE == 1 __kernel -#elif +#else __kernel __attribute__((reqd_work_group_size(WGS1, WGS2, 1))) #endif void Xher(const int n, diff --git a/src/kernels/level2/xher2.opencl b/src/kernels/level2/xher2.opencl index c3e85c15..9e7f3c6c 100644 --- a/src/kernels/level2/xher2.opencl +++ b/src/kernels/level2/xher2.opencl @@ -20,7 +20,7 @@ R"( // Symmetric version of the rank-2 matrix update kernel (HER2, HPR2, SYR2, SPR2) #if RELAX_WORKGROUP_SIZE == 1 __kernel -#elif +#else __kernel __attribute__((reqd_work_group_size(WGS1, WGS2, 1))) #endif void Xher2(const int n, diff --git a/src/kernels/level2/xtrsv.opencl b/src/kernels/level2/xtrsv.opencl index e3b5418c..7677377e 100644 --- a/src/kernels/level2/xtrsv.opencl +++ b/src/kernels/level2/xtrsv.opencl @@ -41,7 +41,7 @@ void FillVector(const int n, const int inc, const int offset, #if RELAX_WORKGROUP_SIZE == 1 __kernel -#elif +#else __kernel __attribute__((reqd_work_group_size(TRSV_BLOCK_SIZE, 1, 1))) #endif void trsv_forward(int n, @@ -93,7 +93,7 @@ void trsv_forward(int n, #if RELAX_WORKGROUP_SIZE == 1 __kernel -#elif +#else __kernel __attribute__((reqd_work_group_size(TRSV_BLOCK_SIZE, 1, 1))) #endif void trsv_backward(int n, diff --git a/src/kernels/level3/convert_hermitian.opencl b/src/kernels/level3/convert_hermitian.opencl index b69be23d..4bb61f4e 100644 --- a/src/kernels/level3/convert_hermitian.opencl +++ b/src/kernels/level3/convert_hermitian.opencl @@ -23,7 +23,7 @@ R"( // stored as the lower-triangle of the input matrix. This uses the padding kernel's parameters. #if RELAX_WORKGROUP_SIZE == 1 __kernel -#elif +#else __kernel __attribute__((reqd_work_group_size(PAD_DIMX, PAD_DIMY, 1))) #endif void HermLowerToSquared(const int src_dim, @@ -66,7 +66,7 @@ void HermLowerToSquared(const int src_dim, // Same as above, but now the matrix' data is stored in the upper-triangle #if RELAX_WORKGROUP_SIZE == 1 __kernel -#elif +#else __kernel __attribute__((reqd_work_group_size(PAD_DIMX, PAD_DIMY, 1))) #endif void HermUpperToSquared(const int src_dim, diff --git a/src/kernels/level3/convert_symmetric.opencl b/src/kernels/level3/convert_symmetric.opencl index 2ce17f40..264bf9c5 100644 --- a/src/kernels/level3/convert_symmetric.opencl +++ b/src/kernels/level3/convert_symmetric.opencl @@ -22,7 +22,7 @@ R"( // stored as the lower-triangle of the input matrix. This uses the padding kernel's parameters. #if RELAX_WORKGROUP_SIZE == 1 __kernel -#elif +#else __kernel __attribute__((reqd_work_group_size(PAD_DIMX, PAD_DIMY, 1))) #endif void SymmLowerToSquared(const int src_dim, @@ -59,7 +59,7 @@ void SymmLowerToSquared(const int src_dim, // Same as above, but now the matrix' data is stored in the upper-triangle #if RELAX_WORKGROUP_SIZE == 1 __kernel -#elif +#else __kernel __attribute__((reqd_work_group_size(PAD_DIMX, PAD_DIMY, 1))) #endif void SymmUpperToSquared(const int src_dim, diff --git a/src/kernels/level3/convert_triangular.opencl b/src/kernels/level3/convert_triangular.opencl index 563f719f..092e1cf2 100644 --- a/src/kernels/level3/convert_triangular.opencl +++ b/src/kernels/level3/convert_triangular.opencl @@ -22,7 +22,7 @@ R"( // stored as the lower-triangle of the input matrix. This uses the padding kernel's parameters. #if RELAX_WORKGROUP_SIZE == 1 __kernel -#elif +#else __kernel __attribute__((reqd_work_group_size(PAD_DIMX, PAD_DIMY, 1))) #endif void TriaLowerToSquared(const int src_dim, @@ -61,7 +61,7 @@ void TriaLowerToSquared(const int src_dim, // Same as above, but now the matrix' data is stored in the upper-triangle #if RELAX_WORKGROUP_SIZE == 1 __kernel -#elif +#else __kernel __attribute__((reqd_work_group_size(PAD_DIMX, PAD_DIMY, 1))) #endif void TriaUpperToSquared(const int src_dim, diff --git a/src/kernels/level3/copy_fast.opencl b/src/kernels/level3/copy_fast.opencl index e1a815f5..04e4b2ab 100644 --- a/src/kernels/level3/copy_fast.opencl +++ b/src/kernels/level3/copy_fast.opencl @@ -37,7 +37,7 @@ R"( // COPY_VW. Also requires both matrices to be of the same dimensions and without offset. #if RELAX_WORKGROUP_SIZE == 1 __kernel -#elif +#else __kernel __attribute__((reqd_work_group_size(COPY_DIMX, COPY_DIMY, 1))) #endif void CopyMatrixFast(const int ld, diff --git a/src/kernels/level3/copy_pad.opencl b/src/kernels/level3/copy_pad.opencl index 6335bd81..dca93b76 100644 --- a/src/kernels/level3/copy_pad.opencl +++ b/src/kernels/level3/copy_pad.opencl @@ -61,7 +61,7 @@ INLINE_FUNC void _CopyPadMatrix(const int src_one, const int src_two, // Interface to the above function #if RELAX_WORKGROUP_SIZE == 1 __kernel -#elif +#else __kernel __attribute__((reqd_work_group_size(PAD_DIMX, PAD_DIMY, 1))) #endif void CopyPadMatrix(const int src_one, const int src_two, @@ -124,7 +124,7 @@ INLINE_FUNC void _CopyMatrix(const int src_one, const int src_two, // Interface to the above function #if RELAX_WORKGROUP_SIZE == 1 __kernel -#elif +#else __kernel __attribute__((reqd_work_group_size(PAD_DIMX, PAD_DIMY, 1))) #endif void CopyMatrix(const int src_one, const int src_two, @@ -148,7 +148,7 @@ void CopyMatrix(const int src_one, const int src_two, // Batched version of the above #if RELAX_WORKGROUP_SIZE == 1 __kernel -#elif +#else __kernel __attribute__((reqd_work_group_size(PAD_DIMX, PAD_DIMY, 1))) #endif void CopyPadMatrixBatched(const int src_one, const int src_two, @@ -170,7 +170,7 @@ void CopyPadMatrixBatched(const int src_one, const int src_two, // Batched version of the above #if RELAX_WORKGROUP_SIZE == 1 __kernel -#elif +#else __kernel __attribute__((reqd_work_group_size(PAD_DIMX, PAD_DIMY, 1))) #endif void CopyMatrixBatched(const int src_one, const int src_two, @@ -195,7 +195,7 @@ void CopyMatrixBatched(const int src_one, const int src_two, // Strided-batched version of the above #if RELAX_WORKGROUP_SIZE == 1 __kernel -#elif +#else __kernel __attribute__((reqd_work_group_size(PAD_DIMX, PAD_DIMY, 1))) #endif void CopyPadMatrixStridedBatched(const int src_one, const int src_two, @@ -217,7 +217,7 @@ void CopyPadMatrixStridedBatched(const int src_one, const int src_two, // Strided-batched version of the above #if RELAX_WORKGROUP_SIZE == 1 __kernel -#elif +#else __kernel __attribute__((reqd_work_group_size(PAD_DIMX, PAD_DIMY, 1))) #endif void CopyMatrixStridedBatched(const int src_one, const int src_two, diff --git a/src/kernels/level3/invert_diagonal_blocks_part1.opencl b/src/kernels/level3/invert_diagonal_blocks_part1.opencl index 3df477d1..580f7b8b 100644 --- a/src/kernels/level3/invert_diagonal_blocks_part1.opencl +++ b/src/kernels/level3/invert_diagonal_blocks_part1.opencl @@ -84,7 +84,7 @@ R"( // Inverts a diagonal block of INTERNAL_BLOCK_SIZE by INTERNAL_BLOCK_SIZE elements in a larger matrix #if RELAX_WORKGROUP_SIZE == 1 __kernel -#elif +#else __kernel __attribute__((reqd_work_group_size(INTERNAL_BLOCK_SIZE, 1, 1))) #endif void InvertDiagonalBlock(const int n, __global const real* restrict src, const int src_offset, const int src_ld, diff --git a/src/kernels/level3/transpose_fast.opencl b/src/kernels/level3/transpose_fast.opencl index e89984cc..9d1b7552 100644 --- a/src/kernels/level3/transpose_fast.opencl +++ b/src/kernels/level3/transpose_fast.opencl @@ -38,7 +38,7 @@ R"( // offset. A more general version is available in 'padtranspose.opencl'. #if RELAX_WORKGROUP_SIZE == 1 __kernel -#elif +#else __kernel __attribute__((reqd_work_group_size(TRA_DIM, TRA_DIM, 1))) #endif void TransposeMatrixFast(const int ld, diff --git a/src/kernels/level3/transpose_pad.opencl b/src/kernels/level3/transpose_pad.opencl index 31de0e62..3877a3d5 100644 --- a/src/kernels/level3/transpose_pad.opencl +++ b/src/kernels/level3/transpose_pad.opencl @@ -86,7 +86,7 @@ INLINE_FUNC void _TransposePadMatrix(LOCAL_PTR real* tile, // Interface to the above function #if RELAX_WORKGROUP_SIZE == 1 __kernel -#elif +#else __kernel __attribute__((reqd_work_group_size(PADTRA_TILE, PADTRA_TILE, 1))) #endif void TransposePadMatrix(const int src_one, const int src_two, @@ -178,7 +178,7 @@ INLINE_FUNC void _TransposeMatrix(LOCAL_PTR real* tile, // Interface to the above function #if RELAX_WORKGROUP_SIZE == 1 __kernel -#elif +#else __kernel __attribute__((reqd_work_group_size(PADTRA_TILE, PADTRA_TILE, 1))) #endif void TransposeMatrix(const int src_one, const int src_two, @@ -203,7 +203,7 @@ void TransposeMatrix(const int src_one, const int src_two, // Batched version of the above #if RELAX_WORKGROUP_SIZE == 1 __kernel -#elif +#else __kernel __attribute__((reqd_work_group_size(PADTRA_TILE, PADTRA_TILE, 1))) #endif void TransposePadMatrixBatched(const int src_one, const int src_two, @@ -226,7 +226,7 @@ void TransposePadMatrixBatched(const int src_one, const int src_two, // Batched version of the above #if RELAX_WORKGROUP_SIZE == 1 __kernel -#elif +#else __kernel __attribute__((reqd_work_group_size(PADTRA_TILE, PADTRA_TILE, 1))) #endif void TransposeMatrixBatched(const int src_one, const int src_two, @@ -252,7 +252,7 @@ void TransposeMatrixBatched(const int src_one, const int src_two, // Strided-batched version of the above #if RELAX_WORKGROUP_SIZE == 1 __kernel -#elif +#else __kernel __attribute__((reqd_work_group_size(PADTRA_TILE, PADTRA_TILE, 1))) #endif void TransposePadMatrixStridedBatched(const int src_one, const int src_two, @@ -275,7 +275,7 @@ void TransposePadMatrixStridedBatched(const int src_one, const int src_two, // Strided-batched version of the above #if RELAX_WORKGROUP_SIZE == 1 __kernel -#elif +#else __kernel __attribute__((reqd_work_group_size(PADTRA_TILE, PADTRA_TILE, 1))) #endif void TransposeMatrixStridedBatched(const int src_one, const int src_two, diff --git a/src/kernels/level3/xgemm_batched.opencl b/src/kernels/level3/xgemm_batched.opencl index e014b7a9..41d07d19 100644 --- a/src/kernels/level3/xgemm_batched.opencl +++ b/src/kernels/level3/xgemm_batched.opencl @@ -21,7 +21,7 @@ R"( #if RELAX_WORKGROUP_SIZE == 1 __kernel -#elif +#else __kernel __attribute__((reqd_work_group_size(MDIMC, NDIMC, 1))) #endif void XgemmBatched(const int kSizeM, const int kSizeN, const int kSizeK, @@ -68,7 +68,7 @@ void XgemmBatched(const int kSizeM, const int kSizeN, const int kSizeK, #if RELAX_WORKGROUP_SIZE == 1 __kernel -#elif +#else __kernel __attribute__((reqd_work_group_size(MDIMC, NDIMC, 1))) #endif void XgemmStridedBatched(const int kSizeM, const int kSizeN, const int kSizeK, diff --git a/src/kernels/level3/xgemm_direct_batched.opencl b/src/kernels/level3/xgemm_direct_batched.opencl index ec0b008b..102ae762 100644 --- a/src/kernels/level3/xgemm_direct_batched.opencl +++ b/src/kernels/level3/xgemm_direct_batched.opencl @@ -22,7 +22,7 @@ R"( // Direct version of the batched GEMM kernel with [A, B] = [non-transposed, non-transposed] #if RELAX_WORKGROUP_SIZE == 1 __kernel -#elif +#else __kernel __attribute__((reqd_work_group_size(MDIMCD, NDIMCD, 1))) #endif void XgemmDirectBatchedNN(const int kSizeM, const int kSizeN, const int kSizeK, @@ -47,7 +47,7 @@ void XgemmDirectBatchedNN(const int kSizeM, const int kSizeN, const int kSizeK, // Direct version of the batched GEMM kernel with [A, B] = [non-transposed, transposed] #if RELAX_WORKGROUP_SIZE == 1 __kernel -#elif +#else __kernel __attribute__((reqd_work_group_size(MDIMCD, NDIMCD, 1))) #endif void XgemmDirectBatchedNT(const int kSizeM, const int kSizeN, const int kSizeK, @@ -72,7 +72,7 @@ void XgemmDirectBatchedNT(const int kSizeM, const int kSizeN, const int kSizeK, // Direct version of the batched GEMM kernel with [A, B] = [transposed, non-transposed] #if RELAX_WORKGROUP_SIZE == 1 __kernel -#elif +#else __kernel __attribute__((reqd_work_group_size(MDIMCD, NDIMCD, 1))) #endif void XgemmDirectBatchedTN(const int kSizeM, const int kSizeN, const int kSizeK, @@ -97,7 +97,7 @@ void XgemmDirectBatchedTN(const int kSizeM, const int kSizeN, const int kSizeK, // Direct version of the batched GEMM kernel with [A, B] = [transposed, transposed] #if RELAX_WORKGROUP_SIZE == 1 __kernel -#elif +#else __kernel __attribute__((reqd_work_group_size(MDIMCD, NDIMCD, 1))) #endif void XgemmDirectBatchedTT(const int kSizeM, const int kSizeN, const int kSizeK, @@ -126,7 +126,7 @@ void XgemmDirectBatchedTT(const int kSizeM, const int kSizeN, const int kSizeK, // Direct version of the strided-batched GEMM kernel with [A, B] = [non-transposed, non-transposed] #if RELAX_WORKGROUP_SIZE == 1 __kernel -#elif +#else __kernel __attribute__((reqd_work_group_size(MDIMCD, NDIMCD, 1))) #endif void XgemmDirectStridedBatchedNN(const int kSizeM, const int kSizeN, const int kSizeK, @@ -149,7 +149,7 @@ void XgemmDirectStridedBatchedNN(const int kSizeM, const int kSizeN, const int k // Direct version of the strided-batched GEMM kernel with [A, B] = [non-transposed, transposed] #if RELAX_WORKGROUP_SIZE == 1 __kernel -#elif +#else __kernel __attribute__((reqd_work_group_size(MDIMCD, NDIMCD, 1))) #endif void XgemmDirectStridedBatchedNT(const int kSizeM, const int kSizeN, const int kSizeK, @@ -172,7 +172,7 @@ void XgemmDirectStridedBatchedNT(const int kSizeM, const int kSizeN, const int k // Direct version of the strided-batched GEMM kernel with [A, B] = [transposed, non-transposed] #if RELAX_WORKGROUP_SIZE == 1 __kernel -#elif +#else __kernel __attribute__((reqd_work_group_size(MDIMCD, NDIMCD, 1))) #endif void XgemmDirectStridedBatchedTN(const int kSizeM, const int kSizeN, const int kSizeK, @@ -195,7 +195,7 @@ void XgemmDirectStridedBatchedTN(const int kSizeM, const int kSizeN, const int k // Direct version of the strided-batched GEMM kernel with [A, B] = [transposed, transposed] #if RELAX_WORKGROUP_SIZE == 1 __kernel -#elif +#else __kernel __attribute__((reqd_work_group_size(MDIMCD, NDIMCD, 1))) #endif void XgemmDirectStridedBatchedTT(const int kSizeM, const int kSizeN, const int kSizeK, diff --git a/src/kernels/level3/xgemm_direct_part3.opencl b/src/kernels/level3/xgemm_direct_part3.opencl index 66b880e6..5508170e 100644 --- a/src/kernels/level3/xgemm_direct_part3.opencl +++ b/src/kernels/level3/xgemm_direct_part3.opencl @@ -220,7 +220,7 @@ INLINE_FUNC void XgemmDirect(const int kSizeM, const int kSizeN, const int kSize // Direct version of the GEMM kernel with [A, B] = [non-transposed, non-transposed] #if RELAX_WORKGROUP_SIZE == 1 __kernel -#elif +#else __kernel __attribute__((reqd_work_group_size(MDIMCD, NDIMCD, 1))) #endif void XgemmDirectNN(const int kSizeM, const int kSizeN, const int kSizeK, @@ -239,7 +239,7 @@ void XgemmDirectNN(const int kSizeM, const int kSizeN, const int kSizeK, // Direct version of the GEMM kernel with [A, B] = [non-transposed, transposed] #if RELAX_WORKGROUP_SIZE == 1 __kernel -#elif +#else __kernel __attribute__((reqd_work_group_size(MDIMCD, NDIMCD, 1))) #endif void XgemmDirectNT(const int kSizeM, const int kSizeN, const int kSizeK, @@ -258,7 +258,7 @@ void XgemmDirectNT(const int kSizeM, const int kSizeN, const int kSizeK, // Direct version of the GEMM kernel with [A, B] = [transposed, non-transposed] #if RELAX_WORKGROUP_SIZE == 1 __kernel -#elif +#else __kernel __attribute__((reqd_work_group_size(MDIMCD, NDIMCD, 1))) #endif void XgemmDirectTN(const int kSizeM, const int kSizeN, const int kSizeK, @@ -277,7 +277,7 @@ void XgemmDirectTN(const int kSizeM, const int kSizeN, const int kSizeK, // Direct version of the GEMM kernel with [A, B] = [transposed, transposed] #if RELAX_WORKGROUP_SIZE == 1 __kernel -#elif +#else __kernel __attribute__((reqd_work_group_size(MDIMCD, NDIMCD, 1))) #endif void XgemmDirectTT(const int kSizeM, const int kSizeN, const int kSizeK, diff --git a/src/kernels/level3/xgemm_part4.opencl b/src/kernels/level3/xgemm_part4.opencl index a64e2efa..05524337 100644 --- a/src/kernels/level3/xgemm_part4.opencl +++ b/src/kernels/level3/xgemm_part4.opencl @@ -21,7 +21,7 @@ R"( // Main entry point of the kernel. This is the upper-triangular version. #if RELAX_WORKGROUP_SIZE == 1 __kernel -#elif +#else __kernel __attribute__((reqd_work_group_size(MDIMC, NDIMC, 1))) #endif void XgemmUpper(const int kSizeN, const int kSizeK, @@ -61,7 +61,7 @@ void XgemmUpper(const int kSizeN, const int kSizeK, // Main entry point of the kernel. This is the lower-triangular version. #if RELAX_WORKGROUP_SIZE == 1 __kernel -#elif +#else __kernel __attribute__((reqd_work_group_size(MDIMC, NDIMC, 1))) #endif void XgemmLower(const int kSizeN, const int kSizeK, @@ -105,7 +105,7 @@ void XgemmLower(const int kSizeN, const int kSizeK, // Main entry point of the kernel. This is the regular full version. #if RELAX_WORKGROUP_SIZE == 1 __kernel -#elif +#else __kernel __attribute__((reqd_work_group_size(MDIMC, NDIMC, 1))) #endif void Xgemm(const int kSizeM, const int kSizeN, const int kSizeK, diff --git a/src/kernels/levelx/col2im.opencl b/src/kernels/levelx/col2im.opencl index fcc307c6..ab0ffbfa 100644 --- a/src/kernels/levelx/col2im.opencl +++ b/src/kernels/levelx/col2im.opencl @@ -94,7 +94,7 @@ INLINE_FUNC void Xcol2im(const int input_h, const int input_w, const int channel // Kernel flip version of the Xcol2im kernel (for convolution) #if RELAX_WORKGROUP_SIZE == 1 __kernel -#elif +#else __kernel __attribute__((reqd_work_group_size(COPY_DIMX, COPY_DIMY, 1))) #endif void Xcol2imKernelFlip(const int input_h, const int input_w, const int channels, @@ -119,7 +119,7 @@ void Xcol2imKernelFlip(const int input_h, const int input_w, const int channels, // Normal version of the Xcol2im kernel (for cross-correlation) #if RELAX_WORKGROUP_SIZE == 1 __kernel -#elif +#else __kernel __attribute__((reqd_work_group_size(COPY_DIMX, COPY_DIMY, 1))) #endif void Xcol2imKernelNormal(const int input_h, const int input_w, const int channels, diff --git a/src/kernels/levelx/im2col.opencl b/src/kernels/levelx/im2col.opencl index 8324468e..59af38fc 100644 --- a/src/kernels/levelx/im2col.opencl +++ b/src/kernels/levelx/im2col.opencl @@ -76,7 +76,7 @@ INLINE_FUNC void Xim2col(const int input_h, const int input_w, const int channel // Kernel flip version of the Xim2col kernel (for convolution) #if RELAX_WORKGROUP_SIZE == 1 __kernel -#elif +#else __kernel __attribute__((reqd_work_group_size(COPY_DIMX, COPY_DIMY, 1))) #endif void Xim2colKernelFlip(const int input_h, const int input_w, const int channels, @@ -97,7 +97,7 @@ void Xim2colKernelFlip(const int input_h, const int input_w, const int channels, // Normal version of the Xim2col kernel (for cross-correlation) #if RELAX_WORKGROUP_SIZE == 1 __kernel -#elif +#else __kernel __attribute__((reqd_work_group_size(COPY_DIMX, COPY_DIMY, 1))) #endif void Xim2colKernelNormal(const int input_h, const int input_w, const int channels, diff --git a/src/kernels/levelx/xconvgemm_part2.opencl b/src/kernels/levelx/xconvgemm_part2.opencl index 79c40f59..38ddd7eb 100644 --- a/src/kernels/levelx/xconvgemm_part2.opencl +++ b/src/kernels/levelx/xconvgemm_part2.opencl @@ -25,7 +25,7 @@ R"( #if defined(CONVGEMM_WITH_IM2COL) #if RELAX_WORKGROUP_SIZE == 1 __kernel -#elif +#else __kernel __attribute__((reqd_work_group_size(MDIMCD, NDIMCD, 1))) #endif void Xconvgemm(const int num_patches, const int num_kernels, const int patch_size, @@ -291,7 +291,7 @@ INLINE_FUNC void Xconvgemm(const int num_patches, const int num_kernels, const i #if !defined(CONVGEMM_WITH_IM2COL) #if RELAX_WORKGROUP_SIZE == 1 __kernel -#elif +#else __kernel __attribute__((reqd_work_group_size(MDIMCD, NDIMCD, 1))) #endif void XconvgemmFlip(const int num_patches, const int num_kernels, const int patch_size, @@ -316,7 +316,7 @@ void XconvgemmFlip(const int num_patches, const int num_kernels, const int patch #if RELAX_WORKGROUP_SIZE == 1 __kernel -#elif +#else __kernel __attribute__((reqd_work_group_size(MDIMCD, NDIMCD, 1))) #endif void XconvgemmNormal(const int num_patches, const int num_kernels, const int patch_size, diff --git a/src/utilities/compile.cpp b/src/utilities/compile.cpp index 7170c30a..59aa6107 100644 --- a/src/utilities/compile.cpp +++ b/src/utilities/compile.cpp @@ -43,7 +43,7 @@ std::shared_ptr CompileFromSource( // For specific devices, use the non-IEE754 compliant OpenCL mad() instruction. This can improve // performance, but might result in a reduced accuracy. - if ((device.IsAMD() && device.IsGPU()) || device.IsQualcomm()) { + if ((device.IsAMD() && device.IsGPU()) || (device.IsQualcomm() && device.IsGPU())) { header_string += "#define USE_CL_MAD 1\n"; } @@ -54,7 +54,7 @@ std::shared_ptr CompileFromSource( // For specific devices add a global synchronisation barrier to the GEMM kernel to optimize // performance through better cache behaviour - if ((device.IsARM() && device.IsGPU()) || device.IsQualcomm()) { + if ((device.IsARM() && device.IsGPU()) || (device.IsQualcomm() && device.IsGPU())) { header_string += "#define GLOBAL_MEM_FENCE 1\n"; } diff --git a/src/utilities/utilities.cpp b/src/utilities/utilities.cpp index 32de2e2e..fbdcf9c2 100644 --- a/src/utilities/utilities.cpp +++ b/src/utilities/utilities.cpp @@ -463,7 +463,7 @@ std::string GetDeviceArchitecture(const Device& device) { else if (device.HasExtension(kKhronosAttributesAMD)) { device_architecture = device.Name(); // Name is architecture for AMD APP and AMD ROCm } - else if (device.IsQualcomm()) { // queries the Adreno GPU architecture version + else if ((device.IsQualcomm() && device.IsGPU())) { // queries the Adreno GPU architecture version device_architecture = device.AdrenoVersion(); } // Note: no else - 'device_architecture' might be the empty string