| 104 | */ |
| 105 | |
| 106 | cl_int |
| 107 | selectVectorization( |
| 108 | const SolutionStep *step, |
| 109 | CLBLASKernExtra *kextra) |
| 110 | { |
| 111 | const TargetDevice *device = &step->device; |
| 112 | cl_device_type devType; |
| 113 | cl_int err; |
| 114 | size_t tw; |
| 115 | bool tra; |
| 116 | size_t checkedSizes[3]; |
| 117 | int i, j; |
| 118 | const CLBlasKargs *kargs = &step->args; |
| 119 | KernelExtraFlags kflags = kextra->flags; |
| 120 | KernelExtraFlags vecFlags[3] = { KEXTRA_NO_COPY_VEC_A, KEXTRA_NO_COPY_VEC_B, |
| 121 | KEXTRA_NO_COPY_VEC_C }; |
| 122 | unsigned int vlen; |
| 123 | unsigned int tsize; |
| 124 | MemoryPattern *mempat; |
| 125 | const SubproblemDim *dim = &step->subdims[1]; |
| 126 | int funcLevel; |
| 127 | |
| 128 | mempat = &clblasSolvers[step->funcID].memPatterns[step->patternID]; |
| 129 | err = clGetDeviceInfo(device->id, CL_DEVICE_TYPE, sizeof(devType), |
| 130 | &devType, NULL); |
| 131 | if (err != CL_SUCCESS) { |
| 132 | return err; |
| 133 | } |
| 134 | |
| 135 | if (isLdsUsed(mempat)) { |
| 136 | kextra->vecLenC = kextra->vecLen = sizeof(cl_float4) / |
| 137 | dtypeSize(step->args.dtype); |
| 138 | kextra->vecLenA = kextra->vecLenB = kextra->vecLen; |
| 139 | } |
| 140 | else { |
| 141 | kextra->vecLenA = kextra->vecLenB = 0; |
| 142 | } |
| 143 | |
| 144 | // select vectorization based upon leading dimensions and starting offsets |
| 145 | for (i = 0; i < 2; i++) { |
| 146 | if (!i) { |
| 147 | // check by leading dimensions |
| 148 | checkedSizes[0] = kargs->lda.matrix; |
| 149 | if (funcBlasLevel(step->funcID) == 2) { |
| 150 | checkedSizes[1] = checkedSizes[2] = 0; |
| 151 | } |
| 152 | else { |
| 153 | checkedSizes[1] = kargs->ldb.matrix; |
| 154 | checkedSizes[2] = kargs->ldc.matrix; |
| 155 | } |
| 156 | } |
| 157 | else { |
| 158 | // check by offsets |
| 159 | checkedSizes[0] = kargs->offA; |
| 160 | checkedSizes[1] = kargs->offBX; |
| 161 | checkedSizes[2] = kargs->offCY; |
| 162 | } |
| 163 |
no test coverage detected