29 int m,
int ncols,
int kmax,
30 int* piv_item,
int piv_base,
32 SxAcc sx, ValAcc rval,
35 namespace sd = ::batchlas::sycl_device;
37 const auto g = it.get_group();
38 const auto sg = it.get_sub_group();
39 const int tid =
static_cast<int>(it.get_local_linear_id());
40 const int lane =
static_cast<int>(sg.get_local_linear_id());
41 const int nlanes =
static_cast<int>(sg.get_local_linear_range());
42 const int team =
static_cast<int>(sg.get_group_linear_id());
43 const int nteams =
static_cast<int>(sg.get_group_linear_range());
46 const bool live = (tid < m);
47 const std::ptrdiff_t ldp =
static_cast<std::ptrdiff_t
>(ld);
51 for (
int c = 0; c < NB; ++c) {
53 if (live && c < ncols) v = a[tid +
static_cast<std::ptrdiff_t
>(c) * ldp];
57 int rowid = live ? tid : -1;
58 int32_t info_local = (tid == 0) ? *info_item : 0;
61 for (
int j = 0; j < NB; ++j) {
62 if (j >= kmax)
continue;
67 const bool cand = (rowid >= j);
68 R bv = (cand && (mag == mag)) ? mag : R(-1);
69 int bi = cand ? rowid : m;
70 for (uint32_t off =
static_cast<uint32_t
>(nlanes) / 2u; off > 0u; off >>= 1) {
71 const R ov = sycl::permute_group_by_xor(sg, bv, off);
72 const int oi = sycl::permute_group_by_xor(sg, bi, off);
73 if (ov > bv || (ov == bv && oi < bi)) { bv = ov; bi = oi; }
76 rval[
static_cast<std::size_t
>(team)] = bv;
77 ridx[
static_cast<std::size_t
>(team)] = bi;
79 sycl::group_barrier(g);
83 for (
int t = 0; t < nteams; ++t) {
84 const R v = rval[
static_cast<std::size_t
>(t)];
85 const int ii = ridx[
static_cast<std::size_t
>(t)];
86 if (v > fv || (v == fv && ii < p)) { fv = v; p = ii; }
88 static_cast<void>(fv);
91 if (tid == 0) piv_item[j] = piv_base + p + 1;
94 if (rowid == p) rowid = j;
95 else if (rowid == j) rowid = p;
100 for (
int k = j; k < NB; ++k) sx[static_cast<std::size_t>(k)] = rA[k];
102 sycl::group_barrier(g);
104 const D d = sx[
static_cast<std::size_t
>(j)];
105 const bool zero = sd::dev_is_zero(d);
106 if (zero && tid == 0 && info_local == 0) {
107 info_local =
static_cast<int32_t
>(piv_base + j + 1);
109 const D rc = sd::dev_recip(d);
110 const bool use_mul = !zero && sd::dev_isfinite(rc) && !sd::dev_is_zero(rc);
111 const bool act = (rowid > j);
114 if (use_mul) rA[j] = sd::dev_mul(rA[j], rc);
115 else if (!zero) rA[j] = sd::dev_div(rA[j], d);
121 for (
int k = j + 1; k < NB; ++k) {
122 if (k >= ncols)
continue;
123 const D u = sx[
static_cast<std::size_t
>(k)];
125 if (act) rA[k] = sd::dev_sub(rA[k], sd::dev_mul(rA[j], u));
133 for (
int k = 0; k < NB; ++k) {
134 if (k >= ncols)
continue;
135 a[rowid +
static_cast<std::ptrdiff_t
>(k) * ldp] = rA[k];
138 if (tid == 0) *info_item = info_local;
void getf2_panel_reg_device(sycl::nd_item< 1 > it, D *a, int ld, int m, int ncols, int kmax, int *piv_item, int piv_base, int32_t *info_item, SxAcc sx, ValAcc rval, IdxAcc ridx)