1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
|
/* ************************************************************************
* 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.
* ************************************************************************/
// Problem iterator to scatter solving, for passing over matrix A
#include <assert.h>
#include <sys/types.h>
#include <clblas_stddef.h>
#include "matrix_dims.h"
#include "problem_iter.h"
void VISIBILITY_HIDDEN
initProblemIterator(
ProblemIterator *iter,
BlasFunctionID funcID,
MatrixRole mrole,
CLBlasKargs *kargs,
size_t maxPanels,
size_t maxBlocks,
SubproblemDim *topDim)
{
SubproblemDim tmp;
iter->mrole = mrole;
iter->funcID = funcID;
kargsToProbDims(&tmp, funcID, kargs, false);
iter->size = matrBlockHeight(&tmp, mrole, kargs->side);
iter->globPitch = matrBlockPitch(&tmp, mrole, kargs->dtype, kargs->side);
iter->maxPanels = maxPanels;
iter->maxBlocks = maxBlocks;
iter->uplo = kargs->uplo;
iter->side = kargs->side;
iter->dtype = kargs->dtype;
iter->bpitch = matrBlockPitch(topDim, mrole, kargs->dtype, kargs->side);
iter->bheight = matrBlockHeight(topDim, mrole, kargs->side);
iteratorReset(iter);
}
void VISIBILITY_HIDDEN
iteratorReset(ProblemIterator *iter)
{
if (isIterBackward(iter)) {
iter->pos = iter->size;
iter->prevPos = iter->size;
}
else {
iter->pos = 0;
iter->prevPos = 0;
}
}
bool VISIBILITY_HIDDEN
isIterBackward(ProblemIterator *iter)
{
bool ret = false;
if (iter->funcID != CLBLAS_GEMM) {
ret = (iter->side == clblasLeft && iter->uplo == clblasLower) ||
(iter->side == clblasRight && iter->uplo == clblasUpper);
if (iter->funcID == CLBLAS_TRSM) {
ret = !ret;
}
}
return ret;
}
int VISIBILITY_HIDDEN
iterateProblem(ProblemIterator *iter)
{
bool backward;
size_t dy = 0;
backward = isIterBackward(iter);
if (((iter->funcID != CLBLAS_TRSM) && (!iter->maxPanels)) ||
((iter->funcID == CLBLAS_TRSM) && (!iter->maxBlocks))) {
iter->pos = (backward) ? 0 : iter->size;
return 1;
}
iter->prevPos = iter->pos;
if ((iter->funcID != CLBLAS_TRSM)) {
dy = iter->maxPanels * iter->bheight;
assert(dy != 0);
}
if (backward) {
dy = szmin(iter->pos, dy);
iter->pos -= dy;
}
else {
dy = szmin(dy, iter->size - iter->pos);
iter->pos += dy;
}
return (int)(backward && iter->pos == 0) ||
(!backward && iter->pos == iter->size);
}
size_t VISIBILITY_HIDDEN
iterLastOffset(ProblemIterator *iter)
{
return (iter->pos > iter->prevPos) ? (iter->pos - iter->prevPos) :
(iter->prevPos - iter->pos);
}
|