diff options
Diffstat (limited to 'external/clBLAS/src/tests/correctness/trsm-delta.h')
-rw-r--r-- | external/clBLAS/src/tests/correctness/trsm-delta.h | 240 |
1 files changed, 0 insertions, 240 deletions
diff --git a/external/clBLAS/src/tests/correctness/trsm-delta.h b/external/clBLAS/src/tests/correctness/trsm-delta.h deleted file mode 100644 index 29673442..00000000 --- a/external/clBLAS/src/tests/correctness/trsm-delta.h +++ /dev/null @@ -1,240 +0,0 @@ -/* ************************************************************************ - * Copyright 2013 Advanced Micro Devices, Inc. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * ************************************************************************/ - - -#include <blas-math.h> -#include <common.h> - -// Type-dependant constants -template <class T> -static cl_double DELTA_0(); -template<> -__template_static cl_double DELTA_0<cl_float>() { return pow(2.0, -20); } -template<> -__template_static cl_double DELTA_0<cl_double>() { return pow(2.0, -50); } -template<> -__template_static cl_double DELTA_0<FloatComplex>() { return pow(2.0, -20); } -template<> -__template_static cl_double DELTA_0<DoubleComplex>() { return pow(2.0, -50); } - -size_t -trsmBlockSize(size_t elemSize) -{ - /* TODO: Right now TRSM generators use block size of 16 elements for the - * double complex type, and of 32 elements for another types. - * If this changes, we have to fetch block size from TRSM generator - * somehow. - */ - return (elemSize == sizeof(DoubleComplex)) ? 16 : 32; -} - -template <typename T> -void -trsmDelta( - clblasOrder order, - clblasSide side, - clblasUplo uplo, - clblasTranspose transA, - clblasDiag diag, - size_t M, - size_t N, - T *A, - size_t lda, - T *B, - size_t ldb, - T alpha, - cl_double *delta) -{ - cl_double *deltaCLBLAS, s; - int i, k, j, jStart, jEnd, idx; - int zinc; - size_t z = 0; - size_t bsize; - bool isUpper; - T v; - - isUpper = ((uplo == clblasUpper) && (transA == clblasNoTrans)) || - ((uplo == clblasLower) && (transA != clblasNoTrans)); - - deltaCLBLAS = new cl_double[M * N]; - bsize = trsmBlockSize(sizeof(T)); - - if (side == clblasLeft) { - // Calculate delta of TRSM evaluated with the Gauss' method - - for (k = 0; k < (int)N; k++) { - if (isUpper) { - for (i = (int)M - 1; i >= 0; i--) { - v = getElement<T>(order, clblasNoTrans, i, k, B, ldb); - if (diag == clblasNonUnit) { - v = v / getElement<T>(order, transA, i, i, A, lda); - } - s = module(v) * DELTA_0<T>() * module(alpha); - if (i == (int)(M - 1)) { - delta[i * N + k] = s; - } - else { - delta[i * N + k] = s + delta[(i + 1) * N + k]; - } - assert(delta[i* N + k] >= 0); - } - } - else { - for (i = 0; i < (int)M; i++) { - v = getElement<T>(order, clblasNoTrans, i, k, B, ldb); - if (diag == clblasNonUnit) { - v = v / getElement<T>(order, transA, i, i, A, lda); - } - s = module(v) * DELTA_0<T>() * module(alpha); - if (i == 0) { - delta[i * N + k] = s; - } - else { - delta[i * N + k] = s + delta[(i - 1) * N + k]; - } - assert(delta[i* N + k] >= 0); - } - } - } - - // Calculate clblas TRSM delta - - for (k = 0; k < (int)N; k++) { - for (i = 0; i < (int)M; i++) { - s = 0.0; - - /* - * For the upper triangular matrix the solving process proceeds - * from the bottom to the top, and the bottommost block's - * delta influents most of all. For the lower triangular matrix - * the situation is opposite. - */ - if (isUpper) { - jStart = i / (int)bsize; - // index of the block just after the last matrix block - jEnd = ((int)M + (int)bsize - 1) / (int)bsize; - z = 1; - zinc = 1; - } - else { - jStart = 0; - jEnd = i / (int)bsize + 1; - z = jEnd - jStart; - zinc = -1; - } - - for (j = jStart; j < jEnd; j++) { - idx = j * (int)bsize + i % (int)bsize; - if (idx >= (int)M) { - continue; - } - s += z * delta[idx * N + k]; - z += zinc; - } - - deltaCLBLAS[i * N + k] = s * bsize; - assert(deltaCLBLAS[i* N + k] >= 0); - } - } - } - else { - // Calculate delta of TRSM evaluated with the Gauss' method - - for (i = 0; i < (int)M; i++) { - if (isUpper) { - for (k = 0; k < (int)N; k++) { - v = getElement<T>(order, clblasNoTrans, i, k, B, ldb); - if (diag == clblasNonUnit) { - v = v / getElement<T>(order, transA, k, k, A, lda); - } - s = module(v) * DELTA_0<T>() * module(alpha); - if (k == 0) { - delta[i * N + k] = s; - } - else { - delta[i * N + k] = s + delta[i * N + (k - 1)]; - } - assert(delta[i* N + k] >= 0); - } - } - else { - for (k = (int)N - 1; k >= 0; k--) { - v = getElement<T>(order, clblasNoTrans, i, k, B, ldb); - if (diag == clblasNonUnit) { - v = v / getElement<T>(order, transA, k, k, A, lda); - } - s = module(v) * DELTA_0<T>() * module(alpha); - if (k == (int)(N - 1)) { - delta[i * N + k] = s; - } - else { - delta[i * N + k] = s + delta[i * N + (k + 1)]; - } - assert(delta[i* N + k] >= 0); - } - } - } - - // Calculate clblas TRSM delta - - for (i = 0; i < (int)M; i++) { - for (k = 0; k < (int)N; k++) { - s = 0.0; - - /* - * Approach is the same as for the left side matrix, but delta - * is calculated over the rows rather than the columns. - * Now, since the matrices are swapped, the largest and - * tightest blocks are swapped as well. Therefore, pass - * direction for the upper and lower triangular matrix is also - * swapped. - */ - if (isUpper) { - jStart = 0; - jEnd = k / (int)bsize + 1; - z = jEnd - jStart; - zinc = -1; - } - else { - jStart = k / (int)bsize; - jEnd = (k + (int)bsize - 1) / (int)bsize; - z = 1; - zinc = 1; - } - - for (j = jStart; j < jEnd; j++) { - idx = j * (int)bsize + k % (int)bsize; - if (idx >= (int)N) { - continue; - } - s += z * delta[i * N + idx]; - z += zinc; - } - - deltaCLBLAS[i * N + k] = s * bsize; - assert(deltaCLBLAS[i* N + k] >= 0); - } - } - } - - for (k = 0; k < (int)N; k++) { - for (i = 0; i < (int)M; i++) { - delta[i * N + k] += deltaCLBLAS[i * N + k]; - } - } - - delete[] deltaCLBLAS; -} |