| 1102 | } |
| 1103 | |
| 1104 | void |
| 1105 | detectProblemTails(SolutionStep *step) |
| 1106 | { |
| 1107 | SubproblemDim globDim, offDim; |
| 1108 | SubproblemDim *subdim; |
| 1109 | KernelExtraFlags kflags = KEXTRA_NO_FLAGS; |
| 1110 | |
| 1111 | subdim = step->subdims; |
| 1112 | |
| 1113 | kargsToProbDims(&globDim, step->funcID, &step->args, false); |
| 1114 | kargsToProbDims(&offDim, step->funcID, &step->args, true); |
| 1115 | |
| 1116 | #ifdef DEBUG_2 |
| 1117 | printf("detectProblemTails: subdimy=%d, subdimx=%d, subdimBwidth=%d\n", subdim->y, subdim->x, subdim->bwidth); |
| 1118 | #endif |
| 1119 | if (globDim.y % subdim->y) { |
| 1120 | kflags |= KEXTRA_TAILS_M; |
| 1121 | } |
| 1122 | if (globDim.x % subdim->x) { |
| 1123 | kflags |= KEXTRA_TAILS_N; |
| 1124 | } |
| 1125 | if (globDim.bwidth % subdim->bwidth) { |
| 1126 | kflags |= KEXTRA_TAILS_K; |
| 1127 | } |
| 1128 | if (clblasSolvers[step->funcID].memPatterns[step->patternID].nrLevels > 1) { |
| 1129 | if (globDim.y % subdim[1].y) { |
| 1130 | kflags |= KEXTRA_TAILS_M_LOWER; |
| 1131 | } |
| 1132 | if (globDim.x % subdim[1].x) { |
| 1133 | kflags |= KEXTRA_TAILS_N_LOWER; |
| 1134 | } |
| 1135 | if (globDim.bwidth % subdim[1].bwidth) { |
| 1136 | kflags |= KEXTRA_TAILS_K_LOWER; |
| 1137 | } |
| 1138 | } |
| 1139 | else { |
| 1140 | kflags |= (kflags & KEXTRA_TAILS_M) != 0 ? KEXTRA_TAILS_M_LOWER : 0; |
| 1141 | kflags |= (kflags & KEXTRA_TAILS_N) != 0 ? KEXTRA_TAILS_N_LOWER : 0; |
| 1142 | kflags |= (kflags & KEXTRA_TAILS_K) != 0 ? KEXTRA_TAILS_K_LOWER : 0; |
| 1143 | } |
| 1144 | |
| 1145 | // clean tails flags |
| 1146 | step->extraFlags &= ~(KEXTRA_TAILS_M | KEXTRA_TAILS_N | KEXTRA_TAILS_K |
| 1147 | | KEXTRA_TAILS_M_LOWER |
| 1148 | | KEXTRA_TAILS_N_LOWER |
| 1149 | | KEXTRA_TAILS_K_LOWER); |
| 1150 | // set tails flags |
| 1151 | step->extraFlags |= kflags; |
| 1152 | } |
| 1153 | |
| 1154 | void |
| 1155 | detectOffsets(SolutionStep *step) |
no test coverage detected