42 D* __restrict S,
int lda,
45 int* __restrict fail) {
46 const int lane =
static_cast<int>(sg.get_local_linear_id());
52 for (
int c = 0; c < NB; ++c) {
53 d[c] = (lane < ib && c < ib && c <= lane)
54 ? S[(j + lane) +
static_cast<std::ptrdiff_t
>(j + c) * lda]
60 for (
int k = 0; k < NB; ++k) {
64 const R akk = sycl::select_from_group(sg, sycl_device::dev_real(d[k]),
65 static_cast<uint32_t
>(k));
67 bool active = alive && (k < ib);
70 if (active && !(akk > R(0))) {
71 if (lane == 0) *fail = j + k + 1;
76 const R dkk = active ? sycl::sqrt(akk) : R(1);
77 const R r = R(1) / dkk;
81 d[k] = sycl_device::dev_from_real<D>(dkk);
82 }
else if (lane > k && lane < ib) {
83 d[k] = sycl_device::dev_mul_real(d[k], r);
88 if (lane < ib && lane >= k) {
89 S[(j + lane) +
static_cast<std::ptrdiff_t
>(j + k) * lda] = d[k];
91 if (lane == 0) diag[k] = dkk;
96 sycl::group_barrier(sg);
101 for (
int c = k + 1; c < NB; ++c) {
102 if (c < ib && lane < ib && lane >= c) {
103 d[c] = sycl_device::dev_sub(
105 sycl_device::dev_mul(
107 sycl_device::dev_conj(
108 S[(j + c) +
static_cast<std::ptrdiff_t
>(j + k) * lda])));
118 D* __restrict S,
int lda,
119 int j,
int ib,
int m2,
120 const R* __restrict diag) {
121 for (
int row = tid; row < m2; row += L) {
122 const int i = j + ib + row;
126 for (
int c = 0; c < NB; ++c) {
127 x[c] = (c < ib) ? S[i + static_cast<std::ptrdiff_t>(j + c) * lda] : D{};
131 for (
int c = 0; c < NB; ++c) {
135 for (
int p = 0; p < NB; ++p) {
137 s = sycl_device::dev_sub(
139 sycl_device::dev_mul(
141 sycl_device::dev_conj(
142 S[(j + c) +
static_cast<std::ptrdiff_t
>(j + p) * lda])));
147 x[c] = sycl_device::dev_div_real(s, diag[c]);
152 for (
int c = 0; c < NB; ++c) {
153 if (c < ib) S[i +
static_cast<std::ptrdiff_t
>(j + c) * lda] = x[c];
163 D* __restrict S,
int lda,
164 int j,
int ib,
int m2,
166 const int* __restrict off) {
167 const int Ntiles = Rt * (Rt + 1) / 2;
168 const int base = j + ib;
170 for (
int t = tid; t < Ntiles; t += L) {
171 int lo = 0, hi = Rt - 1;
173 const int mid = (lo + hi + 1) >> 1;
174 if (off[mid] - mid * dR <= t) {
181 const int rt = ct + (t - (off[ct] - ct * dR));
182 const int r0 = rt * TS;
183 const int c0 = ct * TS;
187 for (
int a = 0; a < TS; ++a) {
189 for (
int b = 0; b < TS; ++b) acc[a][b] = D{};
192 for (
int k = 0; k < ib; ++k) {
195 for (
int a = 0; a < TS; ++a) {
196 va[a] = (r0 + a < m2)
197 ? S[(base + r0 + a) +
static_cast<std::ptrdiff_t
>(j + k) * lda]
201 for (
int b = 0; b < TS; ++b) {
202 vb[b] = (c0 + b < m2)
203 ? S[(base + c0 + b) +
static_cast<std::ptrdiff_t
>(j + k) * lda]
207 for (
int a = 0; a < TS; ++a) {
209 for (
int b = 0; b < TS; ++b) {
210 sycl_device::fma_acc(acc[a][b], va[a], sycl_device::dev_conj(vb[b]));
216 for (
int a = 0; a < TS; ++a) {
218 for (
int b = 0; b < TS; ++b) {
219 const int ra = r0 + a;
220 const int cb = c0 + b;
221 if (ra < m2 && cb < m2 && ra >= cb) {
222 D v = sycl_device::dev_sub(
223 S[(base + ra) +
static_cast<std::ptrdiff_t
>(base + cb) * lda],
227 if constexpr (sycl_device::dev_is_complex_v<D>) {
229 v = sycl_device::dev_from_real<D>(sycl_device::dev_real(v));
232 S[(base + ra) +
static_cast<std::ptrdiff_t
>(base + cb) * lda] = v;
244 const sycl::sub_group& sg,
245 int tid,
int L,
bool p1_active,
246 D* __restrict S,
int lda,
248 int* __restrict fail,
250 D* __restrict Ag,
int ldg,
252 const int m2_0 = (n > NB) ? (n - NB) : 0;
253 const int Rt0 = (m2_0 + TS - 1) / TS;
257 for (
int c = 0; c < n; ++c) {
258 for (
int i = tid; i < lda; i += L) {
260 if (i < n && i >= c) {
261 v = upper ? sycl_device::dev_conj(Ag[c +
static_cast<std::ptrdiff_t
>(i) * ldg])
262 : Ag[i +
static_cast<std::ptrdiff_t
>(c) * ldg];
265 v = sycl_device::dev_from_real<D>(sycl_device::dev_real(v));
268 S[i +
static_cast<std::ptrdiff_t
>(c) * lda] = v;
271 for (
int c = tid; c < NB; c += L) diag[c] = R(0);
274 for (
int c = tid; c <= Rt0; c += L) off[c] = c * Rt0 - ((c * (c - 1)) >> 1);
275 if (tid == 0) *fail = 0;
280 for (
int j = 0; j < n; j += NB) {
281 const int ib = (n - j < NB) ? (n - j) : NB;
282 const int m2 = n - j - ib;
284 if (ok && p1_active) {
296 const int Rt = (m2 + TS - 1) / TS;
297 potrf_trailing_tiles<D, R, TS>(tid, L, S, lda, j, ib, m2, Rt, Rt0 - Rt, off);
304 for (
int c = 0; c < n; ++c) {
305 for (
int i = tid; i < n; i += L) {
307 const D v = S[i +
static_cast<std::ptrdiff_t
>(c) * lda];
309 Ag[c +
static_cast<std::ptrdiff_t
>(i) * ldg] = sycl_device::dev_conj(v);
311 Ag[i +
static_cast<std::ptrdiff_t
>(c) * ldg] = v;