36 #ifdef USE_NAIVE_MULTITHREAD
55 #define MINPIV (1.0e-8)
68 volatile AO_TS_t *col_locks,
72 integer i, j, k, pvr = 0, pvc, nr, nc, r;
82 for (i = 0; i < neq; i++) {
92 mul = mulpiv = fapvr = 0.0;
111 for (k = 0; k < nr; k++) {
114 fari =
fabs(a[r][i]);
121 for (k = 0; k < nr; k++) {
124 fari =
fabs(a[r][i]);
125 if (fari >= mulpiv && nzc[r] < nc) {
135 den = papvr[i] = 1.0/papvr[i];
143 while ((pvr = AO_int_load_full((
unsigned int *)&piv[i])) < 0);
155 for (k = 0; k < nr; k++) {
158 if (todo[r] == 0 || r%ncpu != task) {
164 mul = par[i] = par[i]*den;
165 for (j = 0; j < nc; j++) {
171 par[pvc] -= mul*papvr[pvc];
173 par[pvc] = -mul*papvr[pvc];
174 ci[r][nzc[r]++] = pvc;
176 while (atomic_inc_and_test((atomic_t *)&col_locks[pvc]));
179 while (AO_test_and_set_full(&col_locks[pvc]) == AO_TS_CLEAR);
181 ril[k][nril[k]++] = pvc;
182 AO_CLEAR(&col_locks[pvc]);
188 AO_fetch_and_add1_full(&row_locks[i]);
189 while (AO_load_full(&row_locks[i]) < ncpu);
192 for (k = 0; k < nr; k++) {
194 for (j = 0; j < nril[k]; j++) {
196 ri[pvc][nzr[pvc]++] = r;
215 unsigned long *locks,
226 fwd[0] = rhs[piv[0]];
228 AO_store_full(locks, 1);
231 for (i = 1; i < neq; i++) {
233 for (i = 1 + task; i < neq; i+=ncpu) {
235 if (i%ncpu != task) {
continue; }
237 nc = nzc[r = piv[i]];
241 for (k = 0; k < nc; k++) {
244 while (!AO_load_full(&locks[c]));
254 AO_store_full(&locks[i], 1);
257 AO_fetch_and_add1_full(&locks[neq]);
258 while (AO_load_full(&locks[neq]) < ncpu);
263 sol[neq] = fwd[neq]*a[r][neq];
264 AO_store_full(&locks[neq], 0);
266 for (i = neq - 1; i >= 0; i--) {
268 for (i = neq - 1 - task; i >= 0; i-=ncpu) {
270 if (i%ncpu != task) {
continue; }
279 for (k = 0; k < nc; k++) {
280 if ((c = pci[k]) > i) {
281 while (AO_load_full(&locks[c]));
292 AO_store_full(&locks[i], 0);
317 for (i = 0; i < elr; i++) {
318 if ((r = rowindx[i]) >= 0) {
320 for (k = 0; k < elc; k++) {
322 if (!elmat[er + k] && c >= 0) {
324 par[
c] += elmat[er + k];
326 par[
c] = elmat[er + k];
354 for (r = from; r <= to; r++) {
358 for (i = 0; i < nc; i++) {
359 if (nz[r][c = ci[r][i]]) {
364 gri[
c][gnzr[
c]++] = r;
365 gci[r][gnzc[r]++] =
c;
GradientExpression< UnaryExpr< FuncFabs, Expr > > fabs(const GradientExpression< Expr > &u)
static std::stack< cleanup * > c
static const doublereal a