| 174 | |
| 175 | template <typename T> |
| 176 | static void |
| 177 | randomTrsmMatrices( |
| 178 | clblasOrder order, |
| 179 | clblasSide side, |
| 180 | clblasUplo uplo, |
| 181 | clblasDiag diag, |
| 182 | size_t M, |
| 183 | size_t N, |
| 184 | bool useAlpha, |
| 185 | T *alpha, |
| 186 | T *A, |
| 187 | size_t lda, |
| 188 | T *B, |
| 189 | size_t ldb) |
| 190 | { |
| 191 | size_t limA, i, j; |
| 192 | T min, max, x, y; |
| 193 | cl_double modMin, modMax, sum; |
| 194 | |
| 195 | min = ZERO<T>(); |
| 196 | max = ZERO<T>(); |
| 197 | |
| 198 | if (side == clblasLeft) { |
| 199 | limA = M; |
| 200 | } |
| 201 | else { |
| 202 | limA = N; |
| 203 | } |
| 204 | |
| 205 | /* |
| 206 | * Generate max(|a_{ii}|). Determine min(|a_{ii}|). |
| 207 | * Generate a_{ii} which are constrainted by min/max. |
| 208 | */ |
| 209 | switch (diag) { |
| 210 | case clblasUnit: |
| 211 | for (i = 0; i < limA; i++) { |
| 212 | // must not be accessed |
| 213 | setElement<T>(order, clblasNoTrans, i, i, A, lda, ONE<T>()); |
| 214 | } |
| 215 | break; |
| 216 | case clblasNonUnit: |
| 217 | /* Do not allow zeros on A's main diagonal */ |
| 218 | do { |
| 219 | max = random<T>(TRSM_LIMIT_A<T>()); |
| 220 | } while (module(max) < 1); |
| 221 | modMax = module(max); |
| 222 | min = max / 100; |
| 223 | modMin = module(min); |
| 224 | setElement<T>(order, clblasNoTrans, 0, 0, A, lda, max); |
| 225 | for (i = 1; i < limA; i++) { |
| 226 | x = random<T>(modMin, modMax); |
| 227 | if (module(x) == 0) { |
| 228 | x = max; |
| 229 | } |
| 230 | setElement<T>(order, clblasNoTrans, i, i, A, lda, x); |
| 231 | } |
| 232 | break; |
| 233 | } |