130 D* tau_ptr, Real* sred, D* sw) {
132 static_assert(
sizeof(R) ==
sizeof(Real),
"the real slot array must match the scalar's real");
134 const auto g = it.get_group();
135 const auto sg = it.get_sub_group();
136 const int r =
static_cast<int>(it.get_local_linear_id());
137 const int lane =
static_cast<int>(sg.get_local_linear_id());
138 const int sgid =
static_cast<int>(sg.get_group_linear_id());
139 const int nsg =
static_cast<int>(sg.get_group_linear_range());
140 const bool live = (r < m);
145#pragma clang loop unroll(full)
146 for (
int k = 0; k < N; ++k) {
147 rA[k] = (live && k < n) ? a[static_cast<std::ptrdiff_t>(r) +
148 static_cast<std::ptrdiff_t
>(k) * ld]
152#pragma clang loop unroll(full)
153 for (
int j = 0; j < N; ++j) {
154 if (j >= kmax)
continue;
158 if (lane == 0) sred[sgid] = part;
159 if (r == j) sw[0] = rA[j];
160 sycl::group_barrier(g);
164 for (
int i = 1; i < nsg; ++i) smax = sycl::fmax(smax, sred[i]);
165 const D alpha = sw[0];
170 if (lane == 0) sred[nsg + sgid] = ssq_part;
171 sycl::group_barrier(g);
174 for (
int i = 0; i < nsg; ++i) ssq += sred[nsg + i];
183 }
else if (live && r > j) {
185 : sycl_device::dev_div(rA[j], h.
vfactor);
190 const D v = (!live || r < j)
192 : ((r == j) ? sycl_device::dev_one<D>() : rA[j]);
193 const D cv = sycl_device::dev_conj(v);
195 const D ctau = sycl_device::dev_conj(h.
tau);
197#pragma clang loop unroll(full)
198 for (
int k = 0; k < N; ++k) {
199 if (k <= j || k >= n)
continue;
201 if (lane == 0) sw[1 + sgid * N + k] = pw;
203 sycl::group_barrier(g);
205#pragma clang loop unroll(full)
206 for (
int k = 0; k < N; ++k) {
207 if (k <= j || k >= n)
continue;
209 for (
int i = 0; i < nsg; ++i) w = dev_add<D>(w, sw[1 + i * N + k]);
210 rA[k] = sycl_device::dev_sub(
211 rA[k], sycl_device::dev_mul(sycl_device::dev_mul(ctau, w), v));
215#pragma clang loop unroll(full)
216 for (
int k = 0; k < N; ++k) {
218 a[
static_cast<std::ptrdiff_t
>(r) +
static_cast<std::ptrdiff_t
>(k) * ld] = rA[k];
void geqr2_panel_reg_device(sycl::nd_item< 1 > it, D *a, int ld, int m, int n, int kmax, D *tau_ptr, Real *sred, D *sw)