Mentions légales du service
Skip to content
GitLab
Explore
Sign in
Primary navigation
Search or go to…
Project
H
hqr
Manage
Activity
Members
Labels
Plan
Issues
Issue boards
Milestones
Code
Merge requests
Repository
Branches
Commits
Tags
Repository graph
Compare revisions
Deploy
Releases
Container registry
Model registry
Monitor
Incidents
Service Desk
Analyze
Value stream analytics
Contributor analytics
Repository analytics
Model experiments
Help
Help
Support
GitLab documentation
Compare GitLab plans
Community forum
Contribute to GitLab
Provide feedback
Keyboard shortcuts
?
Snippets
Groups
Projects
Admin message
GitLab upgrade completed. Current version is 17.11.3.
Show more breadcrumbs
solverstack
hqr
Commits
33318884
Commit
33318884
authored
6 years ago
by
Mathieu Faverge
Browse files
Options
Downloads
Patches
Plain Diff
Add ts tpqrt with round robin
parent
2fef23a1
No related branches found
No related tags found
No related merge requests found
Changes
4
Hide whitespace changes
Inline
Side-by-side
Showing
4 changed files
CMakeLists.txt
+1
-0
1 addition, 0 deletions
CMakeLists.txt
include/libhqr.h
+1
-0
1 addition, 0 deletions
include/libhqr.h
src/tphqr.c
+90
-204
90 additions, 204 deletions
src/tphqr.c
src/tshqr.c
+153
-0
153 additions, 0 deletions
src/tshqr.c
with
245 additions
and
204 deletions
CMakeLists.txt
+
1
−
0
View file @
33318884
...
@@ -95,6 +95,7 @@ set(srcs
...
@@ -95,6 +95,7 @@ set(srcs
src/svd.c
src/svd.c
src/hqr.c
src/hqr.c
src/tphqr.c
src/tphqr.c
src/tshqr.c
src/mtxtree.c
src/mtxtree.c
# Others
# Others
src/check.c
src/check.c
...
...
This diff is collapsed.
Click to expand it.
include/libhqr.h
+
1
−
0
View file @
33318884
...
@@ -210,6 +210,7 @@ int libhqr_init_tphqr( libhqr_tree_t *qrtree,
...
@@ -210,6 +210,7 @@ int libhqr_init_tphqr( libhqr_tree_t *qrtree,
libhqr_tree_e
hlvl
,
int
a
,
int
p
);
libhqr_tree_e
hlvl
,
int
a
,
int
p
);
int
libhqr_init_tshqr
(
libhqr_tree_t
*
qrtree
,
int
libhqr_init_tshqr
(
libhqr_tree_t
*
qrtree
,
int
roundrobin
,
libhqr_facto_e
trans
,
int
kt
,
int
lt
,
libhqr_facto_e
trans
,
int
kt
,
int
lt
,
const
libhqr_matrix_t
*
A
);
const
libhqr_matrix_t
*
A
);
...
...
This diff is collapsed.
Click to expand it.
src/tphqr.c
+
90
−
204
View file @
33318884
...
@@ -18,7 +18,9 @@
...
@@ -18,7 +18,9 @@
#include
<math.h>
#include
<math.h>
#include
<string.h>
#include
<string.h>
void
print_onelist
(
libhqr_list_t
*
list
)
#if defined(LIBHQR_DEBUG)
static
inline
void
print_onelist
(
libhqr_list_t
*
list
)
{
{
libhqr_list_elt_t
*
elt
=
*
list
;
libhqr_list_elt_t
*
elt
=
*
list
;
while
(
elt
!=
NULL
)
{
while
(
elt
!=
NULL
)
{
...
@@ -28,7 +30,8 @@ void print_onelist( libhqr_list_t *list )
...
@@ -28,7 +30,8 @@ void print_onelist( libhqr_list_t *list )
printf
(
"
\n
"
);
printf
(
"
\n
"
);
}
}
void
print_alllist
(
int
nblist
,
libhqr_list_t
*
lists
)
static
inline
void
print_alllist
(
int
nblist
,
libhqr_list_t
*
lists
)
{
{
int
i
;
int
i
;
...
@@ -36,178 +39,58 @@ void print_alllist( int nblist, libhqr_list_t *lists )
...
@@ -36,178 +39,58 @@ void print_alllist( int nblist, libhqr_list_t *lists )
print_onelist
(
lists
+
i
);
print_onelist
(
lists
+
i
);
}
}
}
}
#endif
static
int
static
int
tphqr_getnbgeqrf
(
const
libhqr_tree_t
*
qrtree
,
int
k
)
tphqr_getnbgeqrf
(
const
libhqr_tree_t
*
qrtree
,
int
k
)
{
{
libhqr_tile_args_t
*
args
=
(
libhqr_tile_args_t
*
)(
qrtree
->
args
);
libhqr_tile_args_t
*
args
=
(
libhqr_tile_args_t
*
)(
qrtree
->
args
);
int
*
nbgeqrf
=
args
->
nbgeqrf
;
int
*
nbgeqrf
=
args
->
nbgeqrf
;
return
nbgeqrf
[
k
];
return
nbgeqrf
[
k
];
}
}
static
int
static
int
tphqr_getm
(
const
libhqr_tree_t
*
qrtree
,
int
k
,
int
i
)
tphqr_getm
(
const
libhqr_tree_t
*
qrtree
,
int
k
,
int
i
)
{
{
libhqr_tile_args_t
*
args
=
(
libhqr_tile_args_t
*
)(
qrtree
->
args
);
libhqr_tile_args_t
*
args
=
(
libhqr_tile_args_t
*
)(
qrtree
->
args
);
int
*
killers
=
args
->
killers
;
int
*
killers
=
args
->
killers
;
killers
+=
k
*
qrtree
->
mt
;
killers
+=
k
*
qrtree
->
mt
;
return
killers
[
i
];
return
killers
[
i
];
}
}
static
int
tshqr_getnbgeqrf
(
const
libhqr_tree_t
*
qrtree
,
int
k
)
{
(
void
)
qrtree
;
(
void
)
k
;
return
1
;
}
static
int
tshqr_getm
(
const
libhqr_tree_t
*
qrtree
,
int
k
,
int
i
)
{
(
void
)
qrtree
;
(
void
)
k
;
(
void
)
i
;
return
0
;
}
int
libhqr_initmtx_tshqr
(
libhqr_tree_t
*
qrtree
,
libhqr_facto_e
trans
,
int
kt
,
int
lt
,
const
libhqr_matrix_t
*
A
)
{
libhqr_tile_args_t
*
args
;
libhqr_tile_info_t
*
tileinfo
;
int
*
pivots
;
int
j
,
k
,
l
;
if
(
qrtree
==
NULL
)
{
fprintf
(
stderr
,
"libhqr_hqr_init, illegal value of qrtree"
);
return
-
1
;
}
if
((
trans
!=
LIBHQR_TSQR
)
&&
(
trans
!=
LIBHQR_TSLQ
))
{
fprintf
(
stderr
,
"libhqr_hqr_init, illegal value of trans"
);
return
-
2
;
}
if
(
A
==
NULL
)
{
fprintf
(
stderr
,
"libhqr_hqr_init, illegal value of A"
);
return
-
3
;
}
libhqr_rdmtx_initfct
(
qrtree
);
qrtree
->
init
=
LIBHQR_QRTREE_MTX
;
qrtree
->
facto
=
trans
;
qrtree
->
getnbgeqrf
=
tshqr_getnbgeqrf
;
qrtree
->
getm
=
tshqr_getm
;
qrtree
->
mt
=
(
trans
==
LIBHQR_TSQR
)
?
A
->
mt
:
A
->
nt
;
qrtree
->
nt
=
kt
;
qrtree
->
p
=
1
;
qrtree
->
a
=
1
;
qrtree
->
args
=
malloc
(
sizeof
(
libhqr_tile_args_t
)
);
args
=
(
libhqr_tile_args_t
*
)
qrtree
->
args
;
args
->
tileinfo
=
malloc
(
qrtree
->
mt
*
qrtree
->
nt
*
sizeof
(
libhqr_tile_info_t
)
);
args
->
killers
=
NULL
;
args
->
pivots
=
malloc
(
qrtree
->
nt
*
sizeof
(
int
)
);
args
->
nbgeqrf
=
NULL
;
tileinfo
=
args
->
tileinfo
;
pivots
=
args
->
pivots
;
/* Initialize the matrix */
for
(
k
=
0
;
k
<
qrtree
->
nt
;
k
++
,
tileinfo
+=
qrtree
->
mt
)
{
tileinfo
[
0
].
type
=
LIBHQR_KILLED_BY_LOCALTREE
;
tileinfo
[
0
].
index
=
0
;
tileinfo
[
0
].
currpiv
=
-
1
;
tileinfo
[
0
].
nextpiv
=
qrtree
->
mt
;
tileinfo
[
0
].
prevpiv
=
qrtree
->
mt
;
tileinfo
[
0
].
first_nextpiv
=
qrtree
->
mt
;
tileinfo
[
0
].
first_prevpiv
=
qrtree
->
mt
;
for
(
j
=
1
;
j
<
qrtree
->
mt
-
lt
;
j
++
,
l
++
)
{
tileinfo
[
j
].
type
=
LIBHQR_KILLED_BY_TS
;
tileinfo
[
j
].
index
=
-
2
;
tileinfo
[
j
].
currpiv
=
0
;
tileinfo
[
j
].
nextpiv
=
qrtree
->
mt
;
tileinfo
[
j
].
prevpiv
=
qrtree
->
mt
;
tileinfo
[
j
].
first_nextpiv
=
qrtree
->
mt
;
tileinfo
[
j
].
first_prevpiv
=
qrtree
->
mt
;
/* If first_nextpiv is undefined, it is the current tile */
if
(
tileinfo
[
0
].
first_nextpiv
==
qrtree
->
mt
)
{
tileinfo
[
0
].
first_nextpiv
=
j
;
}
/* The previous tile is the former first_prevpiv, and the current one become the first_prevpiv */
if
(
tileinfo
[
0
].
first_prevpiv
!=
qrtree
->
mt
)
{
tileinfo
[
tileinfo
[
0
].
first_prevpiv
].
nextpiv
=
j
;
tileinfo
[
j
].
prevpiv
=
tileinfo
[
0
].
first_prevpiv
;
}
tileinfo
[
0
].
first_prevpiv
=
j
;
}
/* Add the new element when performing a TT kernel */
if
(
lt
>
0
)
{
int
last
=
qrtree
->
mt
-
lt
;
for
(
j
=
last
;
j
<
qrtree
->
mt
;
j
++
)
{
tileinfo
[
j
].
type
=
-
1
;
tileinfo
[
j
].
index
=
-
1
;
tileinfo
[
j
].
currpiv
=
-
1
;
tileinfo
[
j
].
nextpiv
=
-
1
;
tileinfo
[
j
].
prevpiv
=
-
1
;
tileinfo
[
j
].
first_nextpiv
=
-
1
;
tileinfo
[
j
].
first_prevpiv
=
-
1
;
}
lt
--
;
}
/* Let's register elt1 as the first pivot */
pivots
[
k
]
=
0
;
}
return
0
;
}
int
int
libhqr_init_tshqr
(
libhqr_tree_t
*
qrtree
,
libhqr_initmtx_tphqr
(
libhqr_tree_t
*
qrtree
,
libhqr_facto_e
trans
,
int
kt
,
int
lt
,
const
libhqr_matrix_t
*
A
)
libhqr_facto_e
trans
,
{
int
kt
,
return
libhqr_initmtx_tshqr
(
qrtree
,
trans
,
kt
,
lt
,
A
);
int
lt
,
}
const
libhqr_matrix_t
*
A
,
libhqr_tree_e
hlvl
,
int
a
,
int
int
p
)
libhqr_initmtx_tphqr
(
libhqr_tree_t
*
qrtree
,
libhqr_facto_e
trans
,
int
kt
,
int
lt
,
const
libhqr_matrix_t
*
A
,
libhqr_tree_e
hlvl
,
int
a
,
int
p
)
{
{
libhqr_tile_args_t
*
args
;
libhqr_tile_args_t
*
args
;
libhqr_tile_info_t
*
tileinfo
;
libhqr_tile_info_t
*
tileinfo
;
int
*
killers
,
*
pivots
;
int
*
killers
,
*
pivots
;
int
low_mt
,
i
,
j
,
k
,
l
;
int
low_mt
,
i
,
j
,
k
,
l
;
int
lp
,
la
,
killer_index
;
int
lp
,
la
,
killer_index
;
if
(
qrtree
==
NULL
)
{
if
(
qrtree
==
NULL
)
{
fprintf
(
stderr
,
"libhqr_hqr_init, illegal value of qrtree"
);
fprintf
(
stderr
,
"libhqr_hqr_init, illegal value of qrtree"
);
return
-
1
;
return
-
1
;
}
}
if
((
trans
!=
LIBHQR_TSQR
)
&&
if
(
(
trans
!=
LIBHQR_TSQR
)
&&
(
trans
!=
LIBHQR_TSLQ
)
)
{
(
trans
!=
LIBHQR_TSLQ
))
{
fprintf
(
stderr
,
"libhqr_hqr_init, illegal value of trans"
);
fprintf
(
stderr
,
"libhqr_hqr_init, illegal value of trans"
);
return
-
2
;
return
-
2
;
}
}
if
(
A
==
NULL
)
{
if
(
A
==
NULL
)
{
fprintf
(
stderr
,
"libhqr_hqr_init, illegal value of A"
);
fprintf
(
stderr
,
"libhqr_hqr_init, illegal value of A"
);
return
-
3
;
return
-
3
;
}
}
/* Compute parameters */
/* Compute parameters */
if
(
a
==
-
1
)
{
if
(
a
==
-
1
)
{
a
=
4
;
/* TODO: add automatic computation */
a
=
4
;
/* TODO: add automatic computation */
}
}
else
{
else
{
...
@@ -227,12 +110,12 @@ libhqr_initmtx_tphqr( libhqr_tree_t *qrtree,
...
@@ -227,12 +110,12 @@ libhqr_initmtx_tphqr( libhqr_tree_t *qrtree,
}
}
libhqr_rdmtx_initfct
(
qrtree
);
libhqr_rdmtx_initfct
(
qrtree
);
qrtree
->
init
=
LIBHQR_QRTREE_MTX
;
qrtree
->
init
=
LIBHQR_QRTREE_MTX
;
qrtree
->
facto
=
trans
;
qrtree
->
facto
=
trans
;
qrtree
->
getnbgeqrf
=
tphqr_getnbgeqrf
;
qrtree
->
getnbgeqrf
=
tphqr_getnbgeqrf
;
qrtree
->
getm
=
tphqr_getm
;
qrtree
->
getm
=
tphqr_getm
;
qrtree
->
mt
=
(
trans
==
LIBHQR_TSQR
)
?
A
->
mt
:
A
->
nt
;
qrtree
->
mt
=
(
trans
==
LIBHQR_TSQR
)
?
A
->
mt
:
A
->
nt
;
qrtree
->
nt
=
kt
;
qrtree
->
nt
=
kt
;
a
=
libhqr_imin
(
a
,
qrtree
->
mt
);
a
=
libhqr_imin
(
a
,
qrtree
->
mt
);
...
@@ -242,15 +125,15 @@ libhqr_initmtx_tphqr( libhqr_tree_t *qrtree,
...
@@ -242,15 +125,15 @@ libhqr_initmtx_tphqr( libhqr_tree_t *qrtree,
qrtree
->
p
=
p
;
qrtree
->
p
=
p
;
qrtree
->
a
=
a
;
qrtree
->
a
=
a
;
qrtree
->
args
=
malloc
(
sizeof
(
libhqr_tile_args_t
)
);
qrtree
->
args
=
malloc
(
sizeof
(
libhqr_tile_args_t
)
);
args
=
(
libhqr_tile_args_t
*
)
qrtree
->
args
;
args
=
(
libhqr_tile_args_t
*
)
qrtree
->
args
;
args
->
tileinfo
=
malloc
(
qrtree
->
mt
*
qrtree
->
nt
*
sizeof
(
libhqr_tile_info_t
)
);
args
->
tileinfo
=
malloc
(
qrtree
->
mt
*
qrtree
->
nt
*
sizeof
(
libhqr_tile_info_t
)
);
args
->
killers
=
malloc
(
qrtree
->
mt
*
qrtree
->
nt
*
sizeof
(
int
)
);
args
->
killers
=
malloc
(
qrtree
->
mt
*
qrtree
->
nt
*
sizeof
(
int
)
);
args
->
pivots
=
malloc
(
2
*
qrtree
->
nt
*
sizeof
(
int
)
);
args
->
pivots
=
malloc
(
2
*
qrtree
->
nt
*
sizeof
(
int
)
);
args
->
nbgeqrf
=
args
->
pivots
+
qrtree
->
nt
;
args
->
nbgeqrf
=
args
->
pivots
+
qrtree
->
nt
;
tileinfo
=
args
->
tileinfo
;
tileinfo
=
args
->
tileinfo
;
killers
=
args
->
killers
;
killers
=
args
->
killers
;
pivots
=
args
->
pivots
;
pivots
=
args
->
pivots
;
/**
/**
* Compute the number of sets:
* Compute the number of sets:
...
@@ -260,9 +143,9 @@ libhqr_initmtx_tphqr( libhqr_tree_t *qrtree,
...
@@ -260,9 +143,9 @@ libhqr_initmtx_tphqr( libhqr_tree_t *qrtree,
* 2) low_mt * p for the low level TS trees
* 2) low_mt * p for the low level TS trees
* 3) low_mt * p to temporary save the node that will be reduced at the next step
* 3) low_mt * p to temporary save the node that will be reduced at the next step
*/
*/
libhqr_list_t
*
lists
=
calloc
(
(
2
*
low_mt
+
1
)
*
p
+
1
,
sizeof
(
libhqr_list_t
)
);
libhqr_list_t
*
lists
=
calloc
(
(
2
*
low_mt
+
1
)
*
p
+
1
,
sizeof
(
libhqr_list_t
)
);
libhqr_list_t
*
lists0
,
*
lists1
,
*
lists2
,
*
lists3
;
libhqr_list_t
*
lists0
,
*
lists1
,
*
lists2
,
*
lists3
;
libhqr_list_elt_t
*
elts
=
malloc
(
qrtree
->
mt
*
sizeof
(
libhqr_list_elt_t
)
);
libhqr_list_elt_t
*
elts
=
malloc
(
qrtree
->
mt
*
sizeof
(
libhqr_list_elt_t
)
);
libhqr_list_elt_t
*
elt1
,
*
elt2
;
libhqr_list_elt_t
*
elt1
,
*
elt2
;
lists3
=
lists
;
lists3
=
lists
;
...
@@ -270,7 +153,7 @@ libhqr_initmtx_tphqr( libhqr_tree_t *qrtree,
...
@@ -270,7 +153,7 @@ libhqr_initmtx_tphqr( libhqr_tree_t *qrtree,
lists1
=
lists2
+
low_mt
*
p
;
lists1
=
lists2
+
low_mt
*
p
;
lists0
=
lists1
+
p
;
lists0
=
lists1
+
p
;
for
(
k
=
0
;
k
<
qrtree
->
mt
-
lt
;
k
++
)
{
for
(
k
=
0
;
k
<
qrtree
->
mt
-
lt
;
k
++
)
{
elts
[
k
].
next
=
NULL
;
elts
[
k
].
next
=
NULL
;
elts
[
k
].
id
=
k
;
elts
[
k
].
id
=
k
;
elts
[
k
].
date
=
0
;
elts
[
k
].
date
=
0
;
...
@@ -282,12 +165,11 @@ libhqr_initmtx_tphqr( libhqr_tree_t *qrtree,
...
@@ -282,12 +165,11 @@ libhqr_initmtx_tphqr( libhqr_tree_t *qrtree,
}
}
/* Initialize the matrix */
/* Initialize the matrix */
for
(
k
=
0
;
k
<
qrtree
->
nt
;
k
++
,
killers
+=
qrtree
->
mt
,
tileinfo
+=
qrtree
->
mt
)
for
(
k
=
0
;
k
<
qrtree
->
nt
;
k
++
,
killers
+=
qrtree
->
mt
,
tileinfo
+=
qrtree
->
mt
)
{
{
killer_index
=
0
;
killer_index
=
0
;
/* Move remaining rows from level 3 to level 2 */
/* Move remaining rows from level 3 to level 2 */
for
(
i
=
0
;
i
<
(
low_mt
*
p
);
i
++
)
{
for
(
i
=
0
;
i
<
(
low_mt
*
p
);
i
++
)
{
assert
(
lists2
[
i
]
==
NULL
);
assert
(
lists2
[
i
]
==
NULL
);
lists2
[
i
]
=
lists3
[
i
];
lists2
[
i
]
=
lists3
[
i
];
lists3
[
i
]
=
NULL
;
lists3
[
i
]
=
NULL
;
...
@@ -295,9 +177,8 @@ libhqr_initmtx_tphqr( libhqr_tree_t *qrtree,
...
@@ -295,9 +177,8 @@ libhqr_initmtx_tphqr( libhqr_tree_t *qrtree,
/* Handle TS tiles */
/* Handle TS tiles */
l
=
0
;
l
=
0
;
for
(
i
=
0
;
i
<
p
;
i
++
)
{
for
(
i
=
0
;
i
<
p
;
i
++
)
{
for
(
j
=
0
;
j
<
low_mt
;
j
++
,
l
++
)
{
for
(
j
=
0
;
j
<
low_mt
;
j
++
,
l
++
)
{
elt1
=
libhqr_list_pop
(
lists2
+
l
);
elt1
=
libhqr_list_pop
(
lists2
+
l
);
elt2
=
libhqr_list_pop
(
lists2
+
l
);
elt2
=
libhqr_list_pop
(
lists2
+
l
);
...
@@ -305,7 +186,7 @@ libhqr_initmtx_tphqr( libhqr_tree_t *qrtree,
...
@@ -305,7 +186,7 @@ libhqr_initmtx_tphqr( libhqr_tree_t *qrtree,
continue
;
continue
;
}
}
assert
(
(
elt1
!=
NULL
)
&&
(
elt1
->
next
==
NULL
)
);
assert
(
(
elt1
!=
NULL
)
&&
(
elt1
->
next
==
NULL
)
);
tileinfo
[
elt1
->
id
].
type
=
LIBHQR_KILLED_BY_LOCALTREE
;
tileinfo
[
elt1
->
id
].
type
=
LIBHQR_KILLED_BY_LOCALTREE
;
tileinfo
[
elt1
->
id
].
index
=
killer_index
;
tileinfo
[
elt1
->
id
].
index
=
killer_index
;
...
@@ -314,15 +195,14 @@ libhqr_initmtx_tphqr( libhqr_tree_t *qrtree,
...
@@ -314,15 +195,14 @@ libhqr_initmtx_tphqr( libhqr_tree_t *qrtree,
tileinfo
[
elt1
->
id
].
prevpiv
=
qrtree
->
mt
;
tileinfo
[
elt1
->
id
].
prevpiv
=
qrtree
->
mt
;
tileinfo
[
elt1
->
id
].
first_nextpiv
=
qrtree
->
mt
;
tileinfo
[
elt1
->
id
].
first_nextpiv
=
qrtree
->
mt
;
tileinfo
[
elt1
->
id
].
first_prevpiv
=
qrtree
->
mt
;
tileinfo
[
elt1
->
id
].
first_prevpiv
=
qrtree
->
mt
;
killers
[
killer_index
]
=
elt1
->
id
;
killers
[
killer_index
]
=
elt1
->
id
;
killer_index
++
;
killer_index
++
;
/* Let's kill the tiles with the main one */
/* Let's kill the tiles with the main one */
while
(
elt2
!=
NULL
)
while
(
elt2
!=
NULL
)
{
{
assert
(
(
elt2
!=
NULL
)
&&
(
elt2
->
next
==
NULL
)
);
assert
(
(
elt2
!=
NULL
)
&&
(
elt2
->
next
==
NULL
)
);
int
date
=
libhqr_imax
(
elt1
->
date
,
elt2
->
date
)
+
1
;
int
date
=
libhqr_imax
(
elt1
->
date
,
elt2
->
date
)
+
1
;
elt1
->
date
=
date
;
elt1
->
date
=
date
;
elt2
->
date
=
date
;
elt2
->
date
=
date
;
...
@@ -339,7 +219,8 @@ libhqr_initmtx_tphqr( libhqr_tree_t *qrtree,
...
@@ -339,7 +219,8 @@ libhqr_initmtx_tphqr( libhqr_tree_t *qrtree,
tileinfo
[
elt1
->
id
].
first_nextpiv
=
elt2
->
id
;
tileinfo
[
elt1
->
id
].
first_nextpiv
=
elt2
->
id
;
}
}
/* The previous tile is the former first_prevpiv, and the current one become the first_prevpiv */
/* The previous tile is the former first_prevpiv, and the current one become the
* first_prevpiv */
if
(
tileinfo
[
elt1
->
id
].
first_prevpiv
!=
qrtree
->
mt
)
{
if
(
tileinfo
[
elt1
->
id
].
first_prevpiv
!=
qrtree
->
mt
)
{
tileinfo
[
tileinfo
[
elt1
->
id
].
first_prevpiv
].
nextpiv
=
elt2
->
id
;
tileinfo
[
tileinfo
[
elt1
->
id
].
first_prevpiv
].
nextpiv
=
elt2
->
id
;
tileinfo
[
elt2
->
id
].
prevpiv
=
tileinfo
[
elt1
->
id
].
first_prevpiv
;
tileinfo
[
elt2
->
id
].
prevpiv
=
tileinfo
[
elt1
->
id
].
first_prevpiv
;
...
@@ -356,7 +237,7 @@ libhqr_initmtx_tphqr( libhqr_tree_t *qrtree,
...
@@ -356,7 +237,7 @@ libhqr_initmtx_tphqr( libhqr_tree_t *qrtree,
}
}
/* Handle local tree */
/* Handle local tree */
for
(
i
=
0
;
i
<
p
;
i
++
)
{
for
(
i
=
0
;
i
<
p
;
i
++
)
{
elt1
=
libhqr_list_pop
(
lists1
+
i
);
elt1
=
libhqr_list_pop
(
lists1
+
i
);
elt2
=
libhqr_list_pop
(
lists1
+
i
);
elt2
=
libhqr_list_pop
(
lists1
+
i
);
...
@@ -364,13 +245,12 @@ libhqr_initmtx_tphqr( libhqr_tree_t *qrtree,
...
@@ -364,13 +245,12 @@ libhqr_initmtx_tphqr( libhqr_tree_t *qrtree,
continue
;
continue
;
}
}
while
(
elt2
!=
NULL
)
while
(
elt2
!=
NULL
)
{
{
int
date
=
libhqr_imax
(
elt1
->
date
,
elt2
->
date
)
+
1
;
int
date
=
libhqr_imax
(
elt1
->
date
,
elt2
->
date
)
+
1
;
elt1
->
date
=
date
;
elt1
->
date
=
date
;
elt2
->
date
=
date
;
elt2
->
date
=
date
;
assert
(
tileinfo
[
elt2
->
id
].
type
==
LIBHQR_KILLED_BY_LOCALTREE
);
assert
(
tileinfo
[
elt2
->
id
].
type
==
LIBHQR_KILLED_BY_LOCALTREE
);
tileinfo
[
elt2
->
id
].
currpiv
=
elt1
->
id
;
tileinfo
[
elt2
->
id
].
currpiv
=
elt1
->
id
;
/* If first_nextpiv is undefined, it is the current tile */
/* If first_nextpiv is undefined, it is the current tile */
...
@@ -378,7 +258,8 @@ libhqr_initmtx_tphqr( libhqr_tree_t *qrtree,
...
@@ -378,7 +258,8 @@ libhqr_initmtx_tphqr( libhqr_tree_t *qrtree,
tileinfo
[
elt1
->
id
].
first_nextpiv
=
elt2
->
id
;
tileinfo
[
elt1
->
id
].
first_nextpiv
=
elt2
->
id
;
}
}
/* The previous tile is the former first_prevpiv, and the current one become the first_prevpiv */
/* The previous tile is the former first_prevpiv, and the current one become the
* first_prevpiv */
if
(
tileinfo
[
elt1
->
id
].
first_prevpiv
!=
qrtree
->
mt
)
{
if
(
tileinfo
[
elt1
->
id
].
first_prevpiv
!=
qrtree
->
mt
)
{
tileinfo
[
tileinfo
[
elt1
->
id
].
first_prevpiv
].
nextpiv
=
elt2
->
id
;
tileinfo
[
tileinfo
[
elt1
->
id
].
first_prevpiv
].
nextpiv
=
elt2
->
id
;
tileinfo
[
elt2
->
id
].
prevpiv
=
tileinfo
[
elt1
->
id
].
first_prevpiv
;
tileinfo
[
elt2
->
id
].
prevpiv
=
tileinfo
[
elt1
->
id
].
first_prevpiv
;
...
@@ -409,13 +290,12 @@ libhqr_initmtx_tphqr( libhqr_tree_t *qrtree,
...
@@ -409,13 +290,12 @@ libhqr_initmtx_tphqr( libhqr_tree_t *qrtree,
continue
;
continue
;
}
}
while
(
elt2
!=
NULL
)
while
(
elt2
!=
NULL
)
{
{
int
date
=
libhqr_imax
(
elt1
->
date
,
elt2
->
date
)
+
1
;
int
date
=
libhqr_imax
(
elt1
->
date
,
elt2
->
date
)
+
1
;
elt1
->
date
=
date
;
elt1
->
date
=
date
;
elt2
->
date
=
date
;
elt2
->
date
=
date
;
assert
(
tileinfo
[
elt2
->
id
].
type
==
LIBHQR_KILLED_BY_DISTTREE
);
assert
(
tileinfo
[
elt2
->
id
].
type
==
LIBHQR_KILLED_BY_DISTTREE
);
tileinfo
[
elt2
->
id
].
currpiv
=
elt1
->
id
;
tileinfo
[
elt2
->
id
].
currpiv
=
elt1
->
id
;
/* If first_nextpiv is undefined, it is the current tile */
/* If first_nextpiv is undefined, it is the current tile */
...
@@ -423,7 +303,8 @@ libhqr_initmtx_tphqr( libhqr_tree_t *qrtree,
...
@@ -423,7 +303,8 @@ libhqr_initmtx_tphqr( libhqr_tree_t *qrtree,
tileinfo
[
elt1
->
id
].
first_nextpiv
=
elt2
->
id
;
tileinfo
[
elt1
->
id
].
first_nextpiv
=
elt2
->
id
;
}
}
/* The previous tile is the former first_prevpiv, and the current one become the first_prevpiv */
/* The previous tile is the former first_prevpiv, and the current one become the
* first_prevpiv */
if
(
tileinfo
[
elt1
->
id
].
first_prevpiv
!=
qrtree
->
mt
)
{
if
(
tileinfo
[
elt1
->
id
].
first_prevpiv
!=
qrtree
->
mt
)
{
tileinfo
[
tileinfo
[
elt1
->
id
].
first_prevpiv
].
nextpiv
=
elt2
->
id
;
tileinfo
[
tileinfo
[
elt1
->
id
].
first_prevpiv
].
nextpiv
=
elt2
->
id
;
tileinfo
[
elt2
->
id
].
prevpiv
=
tileinfo
[
elt1
->
id
].
first_prevpiv
;
tileinfo
[
elt2
->
id
].
prevpiv
=
tileinfo
[
elt1
->
id
].
first_prevpiv
;
...
@@ -456,7 +337,7 @@ libhqr_initmtx_tphqr( libhqr_tree_t *qrtree,
...
@@ -456,7 +337,7 @@ libhqr_initmtx_tphqr( libhqr_tree_t *qrtree,
/* Add the new element when performing a TT kernel */
/* Add the new element when performing a TT kernel */
if
(
lt
>
0
)
{
if
(
lt
>
0
)
{
int
last
=
qrtree
->
mt
-
lt
;
int
last
=
qrtree
->
mt
-
lt
;
elts
[
last
].
next
=
NULL
;
elts
[
last
].
next
=
NULL
;
elts
[
last
].
id
=
last
;
elts
[
last
].
id
=
last
;
elts
[
last
].
date
=
0
;
elts
[
last
].
date
=
0
;
...
@@ -466,7 +347,7 @@ libhqr_initmtx_tphqr( libhqr_tree_t *qrtree,
...
@@ -466,7 +347,7 @@ libhqr_initmtx_tphqr( libhqr_tree_t *qrtree,
assert
(
lp
*
low_mt
+
la
<
low_mt
*
p
);
assert
(
lp
*
low_mt
+
la
<
low_mt
*
p
);
libhqr_list_push
(
lists3
+
lp
*
low_mt
+
la
,
elts
+
last
);
libhqr_list_push
(
lists3
+
lp
*
low_mt
+
la
,
elts
+
last
);
for
(
i
=
last
;
i
<
qrtree
->
mt
;
i
++
)
{
for
(
i
=
last
;
i
<
qrtree
->
mt
;
i
++
)
{
tileinfo
[
i
].
type
=
-
1
;
tileinfo
[
i
].
type
=
-
1
;
tileinfo
[
i
].
index
=
-
1
;
tileinfo
[
i
].
index
=
-
1
;
tileinfo
[
i
].
currpiv
=
-
1
;
tileinfo
[
i
].
currpiv
=
-
1
;
...
@@ -479,13 +360,14 @@ libhqr_initmtx_tphqr( libhqr_tree_t *qrtree,
...
@@ -479,13 +360,14 @@ libhqr_initmtx_tphqr( libhqr_tree_t *qrtree,
}
}
}
}
if
(
0
)
#if defined(LIBHQR_DEBUG
)
{
if
(
0
)
{
tileinfo
=
args
->
tileinfo
;
tileinfo
=
args
->
tileinfo
;
for
(
j
=
0
;
j
<
qrtree
->
nt
;
j
++
,
tileinfo
+=
qrtree
->
mt
)
{
for
(
j
=
0
;
j
<
qrtree
->
nt
;
j
++
,
tileinfo
+=
qrtree
->
mt
)
{
printf
(
"---- Step %d ----
\n
"
,
j
);
printf
(
"---- Step %d ----
\n
"
,
j
);
for
(
i
=
0
;
i
<
qrtree
->
mt
;
i
++
)
{
for
(
i
=
0
;
i
<
qrtree
->
mt
;
i
++
)
{
printf
(
"{type = %-1d, index = %-2d, currpiv = %-3d, nextpiv = %-3d, prevpiv = %-3d, first_nextpiv = %-3d, first_prevpiv = %-3d}
\n
"
,
printf
(
"{type = %-1d, index = %-2d, currpiv = %-3d, nextpiv = %-3d, prevpiv = "
"%-3d, first_nextpiv = %-3d, first_prevpiv = %-3d}
\n
"
,
tileinfo
[
i
].
type
,
tileinfo
[
i
].
type
,
tileinfo
[
i
].
index
,
tileinfo
[
i
].
index
,
tileinfo
[
i
].
currpiv
,
tileinfo
[
i
].
currpiv
,
...
@@ -497,21 +379,25 @@ libhqr_initmtx_tphqr( libhqr_tree_t *qrtree,
...
@@ -497,21 +379,25 @@ libhqr_initmtx_tphqr( libhqr_tree_t *qrtree,
}
}
}
}
if
(
0
)
if
(
0
)
{
{
print_alllist
(
low_mt
*
p
,
lists
);
print_alllist
(
low_mt
*
p
,
lists
);
}
}
#endif
free
(
elts
);
free
(
elts
);
free
(
lists
);
free
(
lists
);
return
0
;
return
0
;
}
}
int
int
libhqr_init_tphqr
(
libhqr_tree_t
*
qrtree
,
libhqr_init_tphqr
(
libhqr_tree_t
*
qrtree
,
libhqr_facto_e
trans
,
int
kt
,
int
lt
,
const
libhqr_matrix_t
*
A
,
libhqr_facto_e
trans
,
libhqr_tree_e
hlvl
,
int
a
,
int
p
)
int
kt
,
int
lt
,
const
libhqr_matrix_t
*
A
,
libhqr_tree_e
hlvl
,
int
a
,
int
p
)
{
{
return
libhqr_initmtx_tphqr
(
qrtree
,
trans
,
kt
,
lt
,
A
,
hlvl
,
a
,
p
);
return
libhqr_initmtx_tphqr
(
qrtree
,
trans
,
kt
,
lt
,
A
,
hlvl
,
a
,
p
);
}
}
This diff is collapsed.
Click to expand it.
src/tshqr.c
0 → 100644
+
153
−
0
View file @
33318884
/**
*
* @file tshqr.c
*
* @copyright 2018-2018 Bordeaux INP, CNRS (LaBRI UMR 5800), Inria,
* Univ. Bordeaux. All rights reserved.
*
* @version 1.0.0
* @author Mathieu Faverge
* @date 2018-09-30
*
*/
#include
"libhqr_internal.h"
#include
"libhqr_list.h"
#include
<assert.h>
#include
<stdlib.h>
#include
<stdio.h>
#include
<math.h>
#include
<string.h>
static
int
tshqr_getnbgeqrf
(
const
libhqr_tree_t
*
qrtree
,
int
k
)
{
(
void
)
qrtree
;
(
void
)
k
;
return
1
;
}
static
int
tshqr_getm
(
const
libhqr_tree_t
*
qrtree
,
int
k
,
int
i
)
{
libhqr_tile_args_t
*
args
=
(
libhqr_tile_args_t
*
)(
qrtree
->
args
);
(
void
)
i
;
return
args
->
nbgeqrf
==
NULL
?
0
:
k
;
}
int
libhqr_initmtx_tshqr
(
libhqr_tree_t
*
qrtree
,
int
roundrobin
,
libhqr_facto_e
trans
,
int
kt
,
int
lt
,
const
libhqr_matrix_t
*
A
)
{
libhqr_tile_args_t
*
args
;
libhqr_tile_info_t
*
tileinfo
;
int
*
pivots
;
int
j
,
k
,
l
,
killer
;
if
(
qrtree
==
NULL
)
{
fprintf
(
stderr
,
"libhqr_hqr_init, illegal value of qrtree"
);
return
-
1
;
}
if
(
(
trans
!=
LIBHQR_TSQR
)
&&
(
trans
!=
LIBHQR_TSLQ
)
)
{
fprintf
(
stderr
,
"libhqr_hqr_init, illegal value of trans"
);
return
-
2
;
}
if
(
A
==
NULL
)
{
fprintf
(
stderr
,
"libhqr_hqr_init, illegal value of A"
);
return
-
3
;
}
libhqr_rdmtx_initfct
(
qrtree
);
qrtree
->
init
=
LIBHQR_QRTREE_MTX
;
qrtree
->
facto
=
trans
;
qrtree
->
getnbgeqrf
=
tshqr_getnbgeqrf
;
qrtree
->
getm
=
tshqr_getm
;
qrtree
->
mt
=
(
trans
==
LIBHQR_TSQR
)
?
A
->
mt
:
A
->
nt
;
qrtree
->
nt
=
kt
;
qrtree
->
p
=
1
;
qrtree
->
a
=
1
;
qrtree
->
args
=
malloc
(
sizeof
(
libhqr_tile_args_t
)
);
args
=
(
libhqr_tile_args_t
*
)
qrtree
->
args
;
args
->
tileinfo
=
malloc
(
qrtree
->
mt
*
qrtree
->
nt
*
sizeof
(
libhqr_tile_info_t
)
);
args
->
killers
=
NULL
;
args
->
pivots
=
malloc
(
qrtree
->
nt
*
sizeof
(
int
)
);
args
->
nbgeqrf
=
roundrobin
?
malloc
(
1
)
:
NULL
;
tileinfo
=
args
->
tileinfo
;
pivots
=
args
->
pivots
;
/* Initialize the matrix */
for
(
k
=
0
;
k
<
qrtree
->
nt
;
k
++
,
tileinfo
+=
qrtree
->
mt
)
{
killer
=
roundrobin
?
k
:
0
;
tileinfo
[
killer
].
type
=
LIBHQR_KILLED_BY_LOCALTREE
;
tileinfo
[
killer
].
index
=
killer
;
tileinfo
[
killer
].
currpiv
=
-
1
;
tileinfo
[
killer
].
nextpiv
=
qrtree
->
mt
;
tileinfo
[
killer
].
prevpiv
=
qrtree
->
mt
;
tileinfo
[
killer
].
first_nextpiv
=
qrtree
->
mt
;
tileinfo
[
killer
].
first_prevpiv
=
qrtree
->
mt
;
l
=
killer
;
for
(
j
=
1
;
j
<
qrtree
->
mt
-
lt
;
j
++
)
{
l
=
(
l
+
1
)
%
(
qrtree
->
mt
-
lt
);
tileinfo
[
l
].
type
=
LIBHQR_KILLED_BY_TS
;
tileinfo
[
l
].
index
=
-
2
;
tileinfo
[
l
].
currpiv
=
killer
;
tileinfo
[
l
].
nextpiv
=
qrtree
->
mt
;
tileinfo
[
l
].
prevpiv
=
qrtree
->
mt
;
tileinfo
[
l
].
first_nextpiv
=
qrtree
->
mt
;
tileinfo
[
l
].
first_prevpiv
=
qrtree
->
mt
;
/* If first_nextpiv is undefined, it is the current tile */
if
(
tileinfo
[
killer
].
first_nextpiv
==
qrtree
->
mt
)
{
tileinfo
[
killer
].
first_nextpiv
=
l
;
}
/* The previous tile is the former first_prevpiv, and the current one become the
* first_prevpiv */
if
(
tileinfo
[
killer
].
first_prevpiv
!=
qrtree
->
mt
)
{
tileinfo
[
tileinfo
[
killer
].
first_prevpiv
].
nextpiv
=
l
;
tileinfo
[
l
].
prevpiv
=
tileinfo
[
killer
].
first_prevpiv
;
}
tileinfo
[
killer
].
first_prevpiv
=
l
;
}
/* Add the new element when performing a TT kernel */
if
(
lt
>
0
)
{
int
last
=
qrtree
->
mt
-
lt
;
for
(
j
=
last
;
j
<
qrtree
->
mt
;
j
++
)
{
tileinfo
[
j
].
type
=
-
1
;
tileinfo
[
j
].
index
=
-
1
;
tileinfo
[
j
].
currpiv
=
-
1
;
tileinfo
[
j
].
nextpiv
=
-
1
;
tileinfo
[
j
].
prevpiv
=
-
1
;
tileinfo
[
j
].
first_nextpiv
=
-
1
;
tileinfo
[
j
].
first_prevpiv
=
-
1
;
}
lt
--
;
}
/* Let's register elt1 as the first pivot */
pivots
[
k
]
=
killer
;
}
return
0
;
}
int
libhqr_init_tshqr
(
libhqr_tree_t
*
qrtree
,
int
roundrobin
,
libhqr_facto_e
trans
,
int
kt
,
int
lt
,
const
libhqr_matrix_t
*
A
)
{
return
libhqr_initmtx_tshqr
(
qrtree
,
roundrobin
,
trans
,
kt
,
lt
,
A
);
}
This diff is collapsed.
Click to expand it.
Preview
0%
Loading
Try again
or
attach a new file
.
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Save comment
Cancel
Please
register
or
sign in
to comment