31 int tid,
int L,
bool store,
32 D* __restrict sA,
int slda,
35 D* __restrict Ag,
int ldg,
38 const auto sAl = sycl::address_space_cast<sycl::access::address_space::local_space,
39 sycl::access::decorated::no>(sA);
40 const auto sBl = sycl::address_space_cast<sycl::access::address_space::local_space,
41 sycl::access::decorated::no>(sB);
42 if (tid == 0) *fail = 0;
43 sycl::group_barrier(it.get_group());
48 for (
int j = 0; j < n; j += NB) {
49 const int ib = (n - j < NB) ? (n - j) : NB;
50 const bool panel_ok = ok;
51 const bool live = panel_ok && (row >= j) && (row < n);
57 for (
int i = 0; i < NB; ++i) {
59 if (live && i < ib && row >= j + i) {
60 v = Ag[row +
static_cast<std::ptrdiff_t
>(j + i) * ldg];
62 if (row == j + i) v = sycl_device::dev_from_real<D>(sycl_device::dev_real(v));
69 for (
int k = 0; k < j; k += NB) {
70 const int kb = ((j - k) < NB) ? (j - k) : NB;
74 for (
int e = tid; e < NB * NB; e += L) {
76 const int kk = e / NB;
78 if (i < ib && kk < kb) {
79 v = sycl_device::dev_conj(
80 Ag[(j + i) +
static_cast<std::ptrdiff_t
>(k + kk) * ldg]);
84 sycl::group_barrier(it.get_group());
89 for (
int kk = 0; kk < NB; ++kk) {
91 ? Ag[row +
static_cast<std::ptrdiff_t
>(k + kk) * ldg]
96 using V = sycl::vec<float, 4>;
97 constexpr int VW = 16 /
static_cast<int>(
sizeof(D));
98 static_assert((NB *
sizeof(D)) % 16 == 0,
"sB column must be whole vectors");
99 auto sBv = sycl::address_space_cast<sycl::access::address_space::local_space,
100 sycl::access::decorated::no>(
101 reinterpret_cast<V*
>(sB));
103 for (
int kk = 0; kk < NB; ++kk) {
106 for (
int v = 0; v < NB / VW; ++v) {
107 const V x = sBv[(kk * NB) / VW + v];
108 __builtin_memcpy(&col[v * VW], &x, 16);
111 for (
int i = 0; i < NB; ++i) {
112 sycl_device::fma_acc(rS[i], rA[kk], col[i]);
116 sycl::group_barrier(it.get_group());
122 for (
int i = 0; i < NB; ++i) {
126 v = sycl_device::dev_sub(rp[i], rS[i]);
129 v = sycl_device::dev_from_real<D>(sycl_device::dev_real(v));
132 sAl[row +
static_cast<std::ptrdiff_t
>(i) * slda] = v;
136 sycl::group_barrier(it.get_group());
138 for (
int i = 0; i < ib; ++i) {
139 const R d = sycl_device::dev_real(sAl[(j + i) +
static_cast<std::ptrdiff_t
>(i) * slda]);
143 const bool bad = ok && !(d > R(0));
146 if (tid == 0) *fail = j + i + 1;
150 sycl::group_barrier(it.get_group());
153 const R dkk = sycl::sqrt(d);
154 const R rs = R(1) / dkk;
156 sAl[row +
static_cast<std::ptrdiff_t
>(i) * slda] =
157 sycl_device::dev_from_real<D>(dkk);
158 }
else if (row > j + i && row < n) {
159 sAl[row +
static_cast<std::ptrdiff_t
>(i) * slda] = sycl_device::dev_mul_real(
160 sAl[row +
static_cast<std::ptrdiff_t
>(i) * slda], rs);
163 sycl::group_barrier(it.get_group());
165 if (ok && row > j + i && row < n) {
166 const D lri = sAl[row +
static_cast<std::ptrdiff_t
>(i) * slda];
167 for (
int c = i + 1; c < ib; ++c) {
168 const D ljc = sAl[(j + c) +
static_cast<std::ptrdiff_t
>(i) * slda];
169 sAl[row +
static_cast<std::ptrdiff_t
>(c) * slda] = sycl_device::dev_sub(
170 sAl[row +
static_cast<std::ptrdiff_t
>(c) * slda],
171 sycl_device::dev_mul(lri, sycl_device::dev_conj(ljc)));
174 sycl::group_barrier(it.get_group());
179 if (store && panel_ok && row < n) {
180 for (
int i = 0; i < ib; ++i) {
182 Ag[row +
static_cast<std::ptrdiff_t
>(j + i) * ldg] =
183 sAl[row +
static_cast<std::ptrdiff_t
>(i) * slda];
187 sycl::group_barrier(it.get_group());
void potrf_lpanel_body(const sycl::nd_item< 1 > &it, int tid, int L, bool store, D *__restrict sA, int slda, D *__restrict sB, int *__restrict fail, D *__restrict Ag, int ldg, int n)