[FIX] Fixed threshold for spmm computational_routines test

communication_v2
Stack-1 15 hours ago
parent e88e3d3008
commit 2acfbe7e4a

@ -49,9 +49,30 @@ compare_dirs() {
local dir2="$2" local dir2="$2"
local logfile="$3" local logfile="$3"
local eps local eps
local eps_mode
local cmp_mode
local n_gamma
local u_round
local total_files=0
local total_fail=0
local total_diff=0
# EPS_MODE selects how the tolerance value is computed (absolute | gamma_n);
# COMPARE selects how it is applied (absolute | relative). They are
# orthogonal: e.g. gamma_n + relative gives the standard finite-precision
# error bound |fl - exact| <= gamma_n * |value| used for spmm.
eps_mode=${PSBLAS_TEST_EPS_MODE:-absolute}
cmp_mode=${PSBLAS_TEST_COMPARE:-absolute}
eps=${PSBLAS_TEST_TOL:-1e-6} eps=${PSBLAS_TEST_TOL:-1e-6}
if [[ "$eps_mode" == "gamma_n" ]]; then
n_gamma=${PSBLAS_TEST_N:-0}
u_round=${PSBLAS_TEST_UNIT_ROUNDOFF:-1.19e-7}
if [[ "$n_gamma" -gt 0 ]]; then
eps=$(awk -v n="$n_gamma" -v u="$u_round" 'BEGIN { g = (n*u)/(1.0 - n*u); printf "%.12g", g }')
fi
fi
if [[ ! -d "$dir1" || ! -d "$dir2" ]]; then if [[ ! -d "$dir1" || ! -d "$dir2" ]]; then
warn "Missing directories for comparison (${dir1}, ${dir2})." warn "Missing directories for comparison (${dir1}, ${dir2})."
return 0 return 0
@ -61,13 +82,14 @@ compare_dirs() {
if [[ ! -f "$file1" ]]; then if [[ ! -f "$file1" ]]; then
continue continue
fi fi
total_files=$((total_files + 1))
local filename local filename
filename=$(basename "$file1") filename=$(basename "$file1")
local file2="$dir2/$filename" local file2="$dir2/$filename"
if [[ -f "$file2" ]]; then if [[ -f "$file2" ]]; then
local diff_count local diff_count
if [[ "${filename}" == *.mtx ]]; then if [[ "${filename}" == *.mtx ]]; then
diff_count=$(awk -v f1="$file1" -v f2="$file2" -v eps="$eps" ' diff_count=$(awk -v f1="$file1" -v f2="$file2" -v eps="$eps" -v mode="$cmp_mode" '
function readvals(fname, vals, line, n, header_seen) { function readvals(fname, vals, line, n, header_seen) {
n = 0 n = 0
while ((getline line < fname) > 0) { while ((getline line < fname) > 0) {
@ -87,7 +109,19 @@ compare_dirs() {
for (i = 1; i <= n; i++) { for (i = 1; i <= n; i++) {
d = a[i] - b[i] d = a[i] - b[i]
if (d < 0) d = -d if (d < 0) d = -d
if (d > eps) diff++ tol = eps
if (mode == "relative") {
# mixed relative/absolute tolerance: scale eps by the
# magnitude of the operands (floor of 1 keeps it absolute
# near zero). Required for finite-precision results whose
# summation order differs between serial and parallel runs.
m = (a[i] < 0 ? -a[i] : a[i])
p = (b[i] < 0 ? -b[i] : b[i])
scale = (m > p ? m : p)
if (scale < 1) scale = 1
tol = eps * scale
}
if (d > tol) diff++
} }
if (n1 != n2) diff += (n1 > n2 ? n1 - n2 : n2 - n1) if (n1 != n2) diff += (n1 > n2 ? n1 - n2 : n2 - n1)
print diff print diff
@ -96,10 +130,32 @@ compare_dirs() {
diff_count=$(diff -U 0 "$file1" "$file2" | grep -E '^[+-]' | grep -v '^[+-]{3}' | wc -l) diff_count=$(diff -U 0 "$file1" "$file2" | grep -E '^[+-]' | grep -v '^[+-]{3}' | wc -l)
fi fi
echo "[DIFF] ${file1} vs ${file2}: ${diff_count} differences" >> "$logfile" echo "[DIFF] ${file1} vs ${file2}: ${diff_count} differences" >> "$logfile"
total_diff=$((total_diff + diff_count))
if [[ "$diff_count" -gt 0 ]]; then
total_fail=$((total_fail + 1))
fi
else else
err "File ${filename} does not exist in ${dir2}" err "File ${filename} does not exist in ${dir2}"
total_fail=$((total_fail + 1))
fi fi
done done
if [[ "$total_files" -eq 0 ]]; then
warn "No files to compare in ${dir1}."
return 0
fi
if [[ "$total_fail" -eq 0 ]]; then
echo -e "${GREEN}[PASS]\t ${dir1} vs ${dir2}: ${total_files}/${total_files} tests passed${RESET}"
return 0
elif [[ "$total_fail" -eq "$total_files" ]]; then
echo -e "${RED}[FAIL]\t ${dir1} vs ${dir2}: 0/${total_files} tests passed${RESET}"
return 2
else
local passed=$((total_files - total_fail))
echo -e "${YELLOW}[WARN]\t ${dir1} vs ${dir2}: ${passed}/${total_files} tests passed, ${total_fail} failed${RESET}"
return 1
fi
} }
get_num_procs() { get_num_procs() {

@ -206,11 +206,13 @@ program main
contains contains
subroutine print_progress(current, total, last_percent, label) subroutine print_progress(current, total, last_percent, label)
use iso_fortran_env, only: error_unit
implicit none implicit none
integer(psb_ipk_), intent(in) :: current, total integer(psb_ipk_), intent(in) :: current, total
integer(psb_ipk_), intent(inout) :: last_percent integer(psb_ipk_), intent(inout) :: last_percent
character(len=*), intent(in) :: label character(len=*), intent(in) :: label
integer(psb_ipk_) :: percent, filled, width, i integer(psb_ipk_) :: percent, filled, width, i
character(len=160) :: line
if (total <= 0) return if (total <= 0) return
percent = int(real(current) / real(total) * 100.0) percent = int(real(current) / real(total) * 100.0)
@ -220,14 +222,29 @@ contains
width = 30 width = 30
filled = int(real(percent) / 100.0 * width) filled = int(real(percent) / 100.0 * width)
write(*,'(A)',advance='no') "[INFO] Progress " // trim(label) // ": [" line = "[INFO] Progress " // trim(label) // ": ["
do i = 1, filled do i = 1, filled
write(*,'(A)',advance='no') "#" line = trim(line) // "#"
end do end do
do i = filled + 1, width do i = filled + 1, width
write(*,'(A)',advance='no') "-" line = trim(line) // "-"
end do end do
write(*,'(A,I3,A,I0,A,I0,A)') "] ", percent, "% (", current, "/", total, ")" line = trim(line) // "] "
write(line(len_trim(line)+1:), '(I3)') percent
line = trim(line) // "% (" // trim(adjustl(itoa(current))) // "/" // trim(adjustl(itoa(total))) // ")"
if (percent < 100) then
write(error_unit,'(A)') char(13) // char(27) // "[2K" // trim(line) // char(27) // "[1A"
else
write(error_unit,'(A)') char(13) // char(27) // "[2K" // trim(line)
end if
call flush(error_unit)
end subroutine print_progress end subroutine print_progress
pure function itoa(i) result(str)
implicit none
integer(psb_ipk_), intent(in) :: i
character(len=32) :: str
write(str,'(I0)') i
end function itoa
end program main end program main

File diff suppressed because it is too large Load Diff

@ -34,6 +34,7 @@ run_mpi "$num_procs" ./runs/psb_gedot_test "${num_procs} processes computation"
# Iterate through files in the first directory # Iterate through files in the first directory
compare_dirs "$dir1" "$dir2" "${log_file_name}" PSBLAS_TEST_EPS_MODE=gamma_n PSBLAS_TEST_N=10000 PSBLAS_TEST_UNIT_ROUNDOFF=1.19e-7 \
compare_dirs "$dir1" "$dir2" "${log_file_name}"
info "PSBLAS psb_gedot test successfully completed." info "PSBLAS psb_gedot test successfully completed."

@ -183,11 +183,13 @@ program main
contains contains
subroutine print_progress(current, total, last_percent, label) subroutine print_progress(current, total, last_percent, label)
use iso_fortran_env, only: error_unit
implicit none implicit none
integer(psb_ipk_), intent(in) :: current, total integer(psb_ipk_), intent(in) :: current, total
integer(psb_ipk_), intent(inout) :: last_percent integer(psb_ipk_), intent(inout) :: last_percent
character(len=*), intent(in) :: label character(len=*), intent(in) :: label
integer(psb_ipk_) :: percent, filled, width, i integer(psb_ipk_) :: percent, filled, width, i
character(len=160) :: line
if (total <= 0) return if (total <= 0) return
percent = int(real(current) / real(total) * 100.0) percent = int(real(current) / real(total) * 100.0)
@ -197,14 +199,29 @@ contains
width = 30 width = 30
filled = int(real(percent) / 100.0 * width) filled = int(real(percent) / 100.0 * width)
write(*,'(A)',advance='no') "[INFO] Progress " // trim(label) // ": [" line = "[INFO] Progress " // trim(label) // ": ["
do i = 1, filled do i = 1, filled
write(*,'(A)',advance='no') "#" line = trim(line) // "#"
end do end do
do i = filled + 1, width do i = filled + 1, width
write(*,'(A)',advance='no') "-" line = trim(line) // "-"
end do end do
write(*,'(A,I3,A,I0,A,I0,A)') "] ", percent, "% (", current, "/", total, ")" line = trim(line) // "] "
write(line(len_trim(line)+1:), '(I3)') percent
line = trim(line) // "% (" // trim(adjustl(itoa(current))) // "/" // trim(adjustl(itoa(total))) // ")"
if (percent < 100) then
write(error_unit,'(A)') char(13) // char(27) // "[2K" // trim(line) // char(27) // "[1A"
else
write(error_unit,'(A)') char(13) // char(27) // "[2K" // trim(line)
end if
call flush(error_unit)
end subroutine print_progress end subroutine print_progress
pure function itoa(i) result(str)
implicit none
integer(psb_ipk_), intent(in) :: i
character(len=32) :: str
write(str,'(I0)') i
end function itoa
end program main end program main

@ -191,3 +191,212 @@
[DIFF] serial/sol_x4_y2.mtx vs parallel/sol_x4_y2.mtx: 0 differences [DIFF] serial/sol_x4_y2.mtx vs parallel/sol_x4_y2.mtx: 0 differences
[DIFF] serial/sol_x4_y3.mtx vs parallel/sol_x4_y3.mtx: 0 differences [DIFF] serial/sol_x4_y3.mtx vs parallel/sol_x4_y3.mtx: 0 differences
[DIFF] serial/sol_x4_y4.mtx vs parallel/sol_x4_y4.mtx: 0 differences [DIFF] serial/sol_x4_y4.mtx vs parallel/sol_x4_y4.mtx: 0 differences
[RUN] psb_gedot
[DATE] 2026-06-03 13:16:42
[DIFF] serial/sol_x1_y1.mtx vs parallel/sol_x1_y1.mtx: 1 differences
[DIFF] serial/sol_x1_y2.mtx vs parallel/sol_x1_y2.mtx: 1 differences
[DIFF] serial/sol_x1_y3.mtx vs parallel/sol_x1_y3.mtx: 0 differences
[DIFF] serial/sol_x1_y4.mtx vs parallel/sol_x1_y4.mtx: 0 differences
[DIFF] serial/sol_x2_y1.mtx vs parallel/sol_x2_y1.mtx: 1 differences
[DIFF] serial/sol_x2_y2.mtx vs parallel/sol_x2_y2.mtx: 1 differences
[DIFF] serial/sol_x2_y3.mtx vs parallel/sol_x2_y3.mtx: 0 differences
[DIFF] serial/sol_x2_y4.mtx vs parallel/sol_x2_y4.mtx: 0 differences
[DIFF] serial/sol_x3_y1.mtx vs parallel/sol_x3_y1.mtx: 1 differences
[DIFF] serial/sol_x3_y2.mtx vs parallel/sol_x3_y2.mtx: 1 differences
[DIFF] serial/sol_x3_y3.mtx vs parallel/sol_x3_y3.mtx: 1 differences
[DIFF] serial/sol_x3_y4.mtx vs parallel/sol_x3_y4.mtx: 0 differences
[DIFF] serial/sol_x4_y1.mtx vs parallel/sol_x4_y1.mtx: 0 differences
[DIFF] serial/sol_x4_y2.mtx vs parallel/sol_x4_y2.mtx: 0 differences
[DIFF] serial/sol_x4_y3.mtx vs parallel/sol_x4_y3.mtx: 0 differences
[DIFF] serial/sol_x4_y4.mtx vs parallel/sol_x4_y4.mtx: 0 differences
[RUN] psb_gedot
[DATE] 2026-06-03 13:22:24
[DIFF] serial/sol_x1_y1.mtx vs parallel/sol_x1_y1.mtx: 1 differences
[DIFF] serial/sol_x1_y2.mtx vs parallel/sol_x1_y2.mtx: 1 differences
[DIFF] serial/sol_x1_y3.mtx vs parallel/sol_x1_y3.mtx: 0 differences
[DIFF] serial/sol_x1_y4.mtx vs parallel/sol_x1_y4.mtx: 0 differences
[DIFF] serial/sol_x2_y1.mtx vs parallel/sol_x2_y1.mtx: 1 differences
[DIFF] serial/sol_x2_y2.mtx vs parallel/sol_x2_y2.mtx: 1 differences
[DIFF] serial/sol_x2_y3.mtx vs parallel/sol_x2_y3.mtx: 0 differences
[DIFF] serial/sol_x2_y4.mtx vs parallel/sol_x2_y4.mtx: 0 differences
[DIFF] serial/sol_x3_y1.mtx vs parallel/sol_x3_y1.mtx: 1 differences
[DIFF] serial/sol_x3_y2.mtx vs parallel/sol_x3_y2.mtx: 1 differences
[DIFF] serial/sol_x3_y3.mtx vs parallel/sol_x3_y3.mtx: 1 differences
[DIFF] serial/sol_x3_y4.mtx vs parallel/sol_x3_y4.mtx: 0 differences
[DIFF] serial/sol_x4_y1.mtx vs parallel/sol_x4_y1.mtx: 0 differences
[DIFF] serial/sol_x4_y2.mtx vs parallel/sol_x4_y2.mtx: 0 differences
[DIFF] serial/sol_x4_y3.mtx vs parallel/sol_x4_y3.mtx: 0 differences
[DIFF] serial/sol_x4_y4.mtx vs parallel/sol_x4_y4.mtx: 0 differences
[RUN] psb_gedot
[DATE] 2026-06-03 14:22:44
[DIFF] serial/sol_x1_y1.mtx vs parallel/sol_x1_y1.mtx: 1 differences
[DIFF] serial/sol_x1_y2.mtx vs parallel/sol_x1_y2.mtx: 1 differences
[DIFF] serial/sol_x1_y3.mtx vs parallel/sol_x1_y3.mtx: 0 differences
[DIFF] serial/sol_x1_y4.mtx vs parallel/sol_x1_y4.mtx: 0 differences
[DIFF] serial/sol_x2_y1.mtx vs parallel/sol_x2_y1.mtx: 1 differences
[DIFF] serial/sol_x2_y2.mtx vs parallel/sol_x2_y2.mtx: 1 differences
[DIFF] serial/sol_x2_y3.mtx vs parallel/sol_x2_y3.mtx: 0 differences
[DIFF] serial/sol_x2_y4.mtx vs parallel/sol_x2_y4.mtx: 0 differences
[DIFF] serial/sol_x3_y1.mtx vs parallel/sol_x3_y1.mtx: 1 differences
[DIFF] serial/sol_x3_y2.mtx vs parallel/sol_x3_y2.mtx: 1 differences
[DIFF] serial/sol_x3_y3.mtx vs parallel/sol_x3_y3.mtx: 1 differences
[DIFF] serial/sol_x3_y4.mtx vs parallel/sol_x3_y4.mtx: 0 differences
[DIFF] serial/sol_x4_y1.mtx vs parallel/sol_x4_y1.mtx: 0 differences
[DIFF] serial/sol_x4_y2.mtx vs parallel/sol_x4_y2.mtx: 0 differences
[DIFF] serial/sol_x4_y3.mtx vs parallel/sol_x4_y3.mtx: 0 differences
[DIFF] serial/sol_x4_y4.mtx vs parallel/sol_x4_y4.mtx: 0 differences
[RUN] psb_gedot
[DATE] 2026-06-03 15:22:09
[DIFF] serial/sol_x1_y1.mtx vs parallel/sol_x1_y1.mtx: 1 differences
[DIFF] serial/sol_x1_y2.mtx vs parallel/sol_x1_y2.mtx: 1 differences
[DIFF] serial/sol_x1_y3.mtx vs parallel/sol_x1_y3.mtx: 0 differences
[DIFF] serial/sol_x1_y4.mtx vs parallel/sol_x1_y4.mtx: 0 differences
[DIFF] serial/sol_x2_y1.mtx vs parallel/sol_x2_y1.mtx: 1 differences
[DIFF] serial/sol_x2_y2.mtx vs parallel/sol_x2_y2.mtx: 1 differences
[DIFF] serial/sol_x2_y3.mtx vs parallel/sol_x2_y3.mtx: 0 differences
[DIFF] serial/sol_x2_y4.mtx vs parallel/sol_x2_y4.mtx: 0 differences
[DIFF] serial/sol_x3_y1.mtx vs parallel/sol_x3_y1.mtx: 1 differences
[DIFF] serial/sol_x3_y2.mtx vs parallel/sol_x3_y2.mtx: 1 differences
[DIFF] serial/sol_x3_y3.mtx vs parallel/sol_x3_y3.mtx: 1 differences
[DIFF] serial/sol_x3_y4.mtx vs parallel/sol_x3_y4.mtx: 0 differences
[DIFF] serial/sol_x4_y1.mtx vs parallel/sol_x4_y1.mtx: 0 differences
[DIFF] serial/sol_x4_y2.mtx vs parallel/sol_x4_y2.mtx: 0 differences
[DIFF] serial/sol_x4_y3.mtx vs parallel/sol_x4_y3.mtx: 0 differences
[DIFF] serial/sol_x4_y4.mtx vs parallel/sol_x4_y4.mtx: 0 differences
[RUN] psb_gedot
[DATE] 2026-06-03 15:29:48
[DIFF] serial/sol_x1_y1.mtx vs parallel/sol_x1_y1.mtx: 1 differences
[DIFF] serial/sol_x1_y2.mtx vs parallel/sol_x1_y2.mtx: 1 differences
[DIFF] serial/sol_x1_y3.mtx vs parallel/sol_x1_y3.mtx: 0 differences
[DIFF] serial/sol_x1_y4.mtx vs parallel/sol_x1_y4.mtx: 0 differences
[DIFF] serial/sol_x2_y1.mtx vs parallel/sol_x2_y1.mtx: 1 differences
[DIFF] serial/sol_x2_y2.mtx vs parallel/sol_x2_y2.mtx: 1 differences
[DIFF] serial/sol_x2_y3.mtx vs parallel/sol_x2_y3.mtx: 0 differences
[DIFF] serial/sol_x2_y4.mtx vs parallel/sol_x2_y4.mtx: 0 differences
[DIFF] serial/sol_x3_y1.mtx vs parallel/sol_x3_y1.mtx: 1 differences
[DIFF] serial/sol_x3_y2.mtx vs parallel/sol_x3_y2.mtx: 1 differences
[DIFF] serial/sol_x3_y3.mtx vs parallel/sol_x3_y3.mtx: 1 differences
[DIFF] serial/sol_x3_y4.mtx vs parallel/sol_x3_y4.mtx: 0 differences
[DIFF] serial/sol_x4_y1.mtx vs parallel/sol_x4_y1.mtx: 0 differences
[DIFF] serial/sol_x4_y2.mtx vs parallel/sol_x4_y2.mtx: 0 differences
[DIFF] serial/sol_x4_y3.mtx vs parallel/sol_x4_y3.mtx: 0 differences
[DIFF] serial/sol_x4_y4.mtx vs parallel/sol_x4_y4.mtx: 0 differences
[RUN] psb_gedot
[DATE] 2026-06-03 15:55:09
[DIFF] serial/sol_x1_y1.mtx vs parallel/sol_x1_y1.mtx: 1 differences
[DIFF] serial/sol_x1_y2.mtx vs parallel/sol_x1_y2.mtx: 1 differences
[DIFF] serial/sol_x1_y3.mtx vs parallel/sol_x1_y3.mtx: 0 differences
[DIFF] serial/sol_x1_y4.mtx vs parallel/sol_x1_y4.mtx: 0 differences
[DIFF] serial/sol_x2_y1.mtx vs parallel/sol_x2_y1.mtx: 1 differences
[DIFF] serial/sol_x2_y2.mtx vs parallel/sol_x2_y2.mtx: 1 differences
[DIFF] serial/sol_x2_y3.mtx vs parallel/sol_x2_y3.mtx: 0 differences
[DIFF] serial/sol_x2_y4.mtx vs parallel/sol_x2_y4.mtx: 0 differences
[DIFF] serial/sol_x3_y1.mtx vs parallel/sol_x3_y1.mtx: 1 differences
[DIFF] serial/sol_x3_y2.mtx vs parallel/sol_x3_y2.mtx: 1 differences
[DIFF] serial/sol_x3_y3.mtx vs parallel/sol_x3_y3.mtx: 1 differences
[DIFF] serial/sol_x3_y4.mtx vs parallel/sol_x3_y4.mtx: 0 differences
[DIFF] serial/sol_x4_y1.mtx vs parallel/sol_x4_y1.mtx: 0 differences
[DIFF] serial/sol_x4_y2.mtx vs parallel/sol_x4_y2.mtx: 0 differences
[DIFF] serial/sol_x4_y3.mtx vs parallel/sol_x4_y3.mtx: 0 differences
[DIFF] serial/sol_x4_y4.mtx vs parallel/sol_x4_y4.mtx: 0 differences
[RUN] psb_gedot
[DATE] 2026-06-03 15:57:37
[DIFF] serial/sol_x1_y1.mtx vs parallel/sol_x1_y1.mtx: 1 differences
[DIFF] serial/sol_x1_y2.mtx vs parallel/sol_x1_y2.mtx: 1 differences
[DIFF] serial/sol_x1_y3.mtx vs parallel/sol_x1_y3.mtx: 0 differences
[DIFF] serial/sol_x1_y4.mtx vs parallel/sol_x1_y4.mtx: 0 differences
[DIFF] serial/sol_x2_y1.mtx vs parallel/sol_x2_y1.mtx: 1 differences
[DIFF] serial/sol_x2_y2.mtx vs parallel/sol_x2_y2.mtx: 1 differences
[DIFF] serial/sol_x2_y3.mtx vs parallel/sol_x2_y3.mtx: 0 differences
[DIFF] serial/sol_x2_y4.mtx vs parallel/sol_x2_y4.mtx: 0 differences
[DIFF] serial/sol_x3_y1.mtx vs parallel/sol_x3_y1.mtx: 1 differences
[DIFF] serial/sol_x3_y2.mtx vs parallel/sol_x3_y2.mtx: 1 differences
[DIFF] serial/sol_x3_y3.mtx vs parallel/sol_x3_y3.mtx: 1 differences
[DIFF] serial/sol_x3_y4.mtx vs parallel/sol_x3_y4.mtx: 0 differences
[DIFF] serial/sol_x4_y1.mtx vs parallel/sol_x4_y1.mtx: 0 differences
[DIFF] serial/sol_x4_y2.mtx vs parallel/sol_x4_y2.mtx: 0 differences
[DIFF] serial/sol_x4_y3.mtx vs parallel/sol_x4_y3.mtx: 0 differences
[DIFF] serial/sol_x4_y4.mtx vs parallel/sol_x4_y4.mtx: 0 differences
[RUN] psb_gedot
[DATE] 2026-06-03 16:10:36
[DIFF] serial/sol_x1_y1.mtx vs parallel/sol_x1_y1.mtx: 0 differences
[DIFF] serial/sol_x1_y2.mtx vs parallel/sol_x1_y2.mtx: 0 differences
[DIFF] serial/sol_x1_y3.mtx vs parallel/sol_x1_y3.mtx: 0 differences
[DIFF] serial/sol_x1_y4.mtx vs parallel/sol_x1_y4.mtx: 0 differences
[DIFF] serial/sol_x2_y1.mtx vs parallel/sol_x2_y1.mtx: 0 differences
[DIFF] serial/sol_x2_y2.mtx vs parallel/sol_x2_y2.mtx: 0 differences
[DIFF] serial/sol_x2_y3.mtx vs parallel/sol_x2_y3.mtx: 0 differences
[DIFF] serial/sol_x2_y4.mtx vs parallel/sol_x2_y4.mtx: 0 differences
[DIFF] serial/sol_x3_y1.mtx vs parallel/sol_x3_y1.mtx: 0 differences
[DIFF] serial/sol_x3_y2.mtx vs parallel/sol_x3_y2.mtx: 0 differences
[DIFF] serial/sol_x3_y3.mtx vs parallel/sol_x3_y3.mtx: 0 differences
[DIFF] serial/sol_x3_y4.mtx vs parallel/sol_x3_y4.mtx: 0 differences
[DIFF] serial/sol_x4_y1.mtx vs parallel/sol_x4_y1.mtx: 0 differences
[DIFF] serial/sol_x4_y2.mtx vs parallel/sol_x4_y2.mtx: 0 differences
[DIFF] serial/sol_x4_y3.mtx vs parallel/sol_x4_y3.mtx: 0 differences
[DIFF] serial/sol_x4_y4.mtx vs parallel/sol_x4_y4.mtx: 0 differences
[RUN] psb_gedot
[DATE] 2026-06-04 10:45:28
[DIFF] serial/sol_x1_y1.mtx vs parallel/sol_x1_y1.mtx: 0 differences
[DIFF] serial/sol_x1_y2.mtx vs parallel/sol_x1_y2.mtx: 0 differences
[DIFF] serial/sol_x1_y3.mtx vs parallel/sol_x1_y3.mtx: 0 differences
[DIFF] serial/sol_x1_y4.mtx vs parallel/sol_x1_y4.mtx: 0 differences
[DIFF] serial/sol_x2_y1.mtx vs parallel/sol_x2_y1.mtx: 0 differences
[DIFF] serial/sol_x2_y2.mtx vs parallel/sol_x2_y2.mtx: 0 differences
[DIFF] serial/sol_x2_y3.mtx vs parallel/sol_x2_y3.mtx: 0 differences
[DIFF] serial/sol_x2_y4.mtx vs parallel/sol_x2_y4.mtx: 0 differences
[DIFF] serial/sol_x3_y1.mtx vs parallel/sol_x3_y1.mtx: 0 differences
[DIFF] serial/sol_x3_y2.mtx vs parallel/sol_x3_y2.mtx: 0 differences
[DIFF] serial/sol_x3_y3.mtx vs parallel/sol_x3_y3.mtx: 0 differences
[DIFF] serial/sol_x3_y4.mtx vs parallel/sol_x3_y4.mtx: 0 differences
[DIFF] serial/sol_x4_y1.mtx vs parallel/sol_x4_y1.mtx: 0 differences
[DIFF] serial/sol_x4_y2.mtx vs parallel/sol_x4_y2.mtx: 0 differences
[DIFF] serial/sol_x4_y3.mtx vs parallel/sol_x4_y3.mtx: 0 differences
[DIFF] serial/sol_x4_y4.mtx vs parallel/sol_x4_y4.mtx: 0 differences
[RUN] psb_gedot
[DATE] 2026-06-04 21:00:08
[DIFF] serial/sol_x1_y1.mtx vs parallel/sol_x1_y1.mtx: 0 differences
[DIFF] serial/sol_x1_y2.mtx vs parallel/sol_x1_y2.mtx: 0 differences
[DIFF] serial/sol_x1_y3.mtx vs parallel/sol_x1_y3.mtx: 0 differences
[DIFF] serial/sol_x1_y4.mtx vs parallel/sol_x1_y4.mtx: 0 differences
[DIFF] serial/sol_x2_y1.mtx vs parallel/sol_x2_y1.mtx: 0 differences
[DIFF] serial/sol_x2_y2.mtx vs parallel/sol_x2_y2.mtx: 0 differences
[DIFF] serial/sol_x2_y3.mtx vs parallel/sol_x2_y3.mtx: 0 differences
[DIFF] serial/sol_x2_y4.mtx vs parallel/sol_x2_y4.mtx: 0 differences
[DIFF] serial/sol_x3_y1.mtx vs parallel/sol_x3_y1.mtx: 0 differences
[DIFF] serial/sol_x3_y2.mtx vs parallel/sol_x3_y2.mtx: 0 differences
[DIFF] serial/sol_x3_y3.mtx vs parallel/sol_x3_y3.mtx: 0 differences
[DIFF] serial/sol_x3_y4.mtx vs parallel/sol_x3_y4.mtx: 0 differences
[DIFF] serial/sol_x4_y1.mtx vs parallel/sol_x4_y1.mtx: 0 differences
[DIFF] serial/sol_x4_y2.mtx vs parallel/sol_x4_y2.mtx: 0 differences
[DIFF] serial/sol_x4_y3.mtx vs parallel/sol_x4_y3.mtx: 0 differences
[DIFF] serial/sol_x4_y4.mtx vs parallel/sol_x4_y4.mtx: 0 differences
[RUN] psb_gedot
[DATE] 2026-06-04 21:19:38
[DIFF] serial/sol_x1_y1.mtx vs parallel/sol_x1_y1.mtx: 0 differences
[DIFF] serial/sol_x1_y2.mtx vs parallel/sol_x1_y2.mtx: 0 differences
[DIFF] serial/sol_x1_y3.mtx vs parallel/sol_x1_y3.mtx: 0 differences
[DIFF] serial/sol_x1_y4.mtx vs parallel/sol_x1_y4.mtx: 0 differences
[DIFF] serial/sol_x2_y1.mtx vs parallel/sol_x2_y1.mtx: 0 differences
[DIFF] serial/sol_x2_y2.mtx vs parallel/sol_x2_y2.mtx: 0 differences
[DIFF] serial/sol_x2_y3.mtx vs parallel/sol_x2_y3.mtx: 0 differences
[DIFF] serial/sol_x2_y4.mtx vs parallel/sol_x2_y4.mtx: 0 differences
[DIFF] serial/sol_x3_y1.mtx vs parallel/sol_x3_y1.mtx: 0 differences
[DIFF] serial/sol_x3_y2.mtx vs parallel/sol_x3_y2.mtx: 0 differences
[DIFF] serial/sol_x3_y3.mtx vs parallel/sol_x3_y3.mtx: 0 differences
[DIFF] serial/sol_x3_y4.mtx vs parallel/sol_x3_y4.mtx: 0 differences
[DIFF] serial/sol_x4_y1.mtx vs parallel/sol_x4_y1.mtx: 0 differences
[DIFF] serial/sol_x4_y2.mtx vs parallel/sol_x4_y2.mtx: 0 differences
[DIFF] serial/sol_x4_y3.mtx vs parallel/sol_x4_y3.mtx: 0 differences
[DIFF] serial/sol_x4_y4.mtx vs parallel/sol_x4_y4.mtx: 0 differences

@ -2,73 +2,73 @@ Welcome to PSBLAS version: 3.9.1
This is the psb_gedot_test sample program This is the psb_gedot_test sample program
Number of processes used in this computation: 1 Number of processes used in this computation: 1
[2026-05-30 13:02:07] Generation gedot single precision result file serial/sol_x1_y1.mtx 1/16 [OK] [2026-06-04 21:19:38] Generation gedot single precision result file serial/sol_x1_y1.mtx 1/16 [OK]
[2026-05-30 13:02:07] Generation gedot single precision result file serial/sol_x1_y2.mtx 2/16 [OK] [2026-06-04 21:19:38] Generation gedot single precision result file serial/sol_x1_y2.mtx 2/16 [OK]
[2026-05-30 13:02:07] Generation gedot single precision result file serial/sol_x1_y3.mtx 3/16 [OK] [2026-06-04 21:19:38] Generation gedot single precision result file serial/sol_x1_y3.mtx 3/16 [OK]
[2026-05-30 13:02:07] Generation gedot single precision result file serial/sol_x1_y4.mtx 4/16 [OK] [2026-06-04 21:19:38] Generation gedot single precision result file serial/sol_x1_y4.mtx 4/16 [OK]
[2026-05-30 13:02:07] Generation gedot single precision result file serial/sol_x2_y1.mtx 5/16 [OK] [2026-06-04 21:19:38] Generation gedot single precision result file serial/sol_x2_y1.mtx 5/16 [OK]
[2026-05-30 13:02:07] Generation gedot single precision result file serial/sol_x2_y2.mtx 6/16 [OK] [2026-06-04 21:19:38] Generation gedot single precision result file serial/sol_x2_y2.mtx 6/16 [OK]
[2026-05-30 13:02:07] Generation gedot single precision result file serial/sol_x2_y3.mtx 7/16 [OK] [2026-06-04 21:19:38] Generation gedot single precision result file serial/sol_x2_y3.mtx 7/16 [OK]
[2026-05-30 13:02:07] Generation gedot single precision result file serial/sol_x2_y4.mtx 8/16 [OK] [2026-06-04 21:19:38] Generation gedot single precision result file serial/sol_x2_y4.mtx 8/16 [OK]
[2026-05-30 13:02:07] Generation gedot single precision result file serial/sol_x3_y1.mtx 9/16 [OK] [2026-06-04 21:19:38] Generation gedot single precision result file serial/sol_x3_y1.mtx 9/16 [OK]
[2026-05-30 13:02:07] Generation gedot single precision result file serial/sol_x3_y2.mtx 10/16 [OK] [2026-06-04 21:19:38] Generation gedot single precision result file serial/sol_x3_y2.mtx 10/16 [OK]
[2026-05-30 13:02:07] Generation gedot single precision result file serial/sol_x3_y3.mtx 11/16 [OK] [2026-06-04 21:19:38] Generation gedot single precision result file serial/sol_x3_y3.mtx 11/16 [OK]
[2026-05-30 13:02:07] Generation gedot single precision result file serial/sol_x3_y4.mtx 12/16 [OK] [2026-06-04 21:19:38] Generation gedot single precision result file serial/sol_x3_y4.mtx 12/16 [OK]
[2026-05-30 13:02:07] Generation gedot single precision result file serial/sol_x4_y1.mtx 13/16 [OK] [2026-06-04 21:19:38] Generation gedot single precision result file serial/sol_x4_y1.mtx 13/16 [OK]
[2026-05-30 13:02:07] Generation gedot single precision result file serial/sol_x4_y2.mtx 14/16 [OK] [2026-06-04 21:19:38] Generation gedot single precision result file serial/sol_x4_y2.mtx 14/16 [OK]
[2026-05-30 13:02:07] Generation gedot single precision result file serial/sol_x4_y3.mtx 15/16 [OK] [2026-06-04 21:19:38] Generation gedot single precision result file serial/sol_x4_y3.mtx 15/16 [OK]
[2026-05-30 13:02:07] Generation gedot single precision result file serial/sol_x4_y4.mtx 16/16 [OK] [2026-06-04 21:19:38] Generation gedot single precision result file serial/sol_x4_y4.mtx 16/16 [OK]
[2026-05-30 13:02:07] Double precision check on file serial/sol_x1_y1.mtx 1/16 [OK] [2026-06-04 21:19:38] Double precision check on file serial/sol_x1_y1.mtx 1/16 [OK]
[2026-05-30 13:02:07] Double precision check on file serial/sol_x1_y2.mtx 2/16 [OK] [2026-06-04 21:19:38] Double precision check on file serial/sol_x1_y2.mtx 2/16 [OK]
[2026-05-30 13:02:07] Double precision check on file serial/sol_x1_y3.mtx 3/16 [OK] [2026-06-04 21:19:38] Double precision check on file serial/sol_x1_y3.mtx 3/16 [OK]
[2026-05-30 13:02:07] Double precision check on file serial/sol_x1_y4.mtx 4/16 [OK] [2026-06-04 21:19:38] Double precision check on file serial/sol_x1_y4.mtx 4/16 [OK]
[2026-05-30 13:02:07] Double precision check on file serial/sol_x2_y1.mtx 5/16 [OK] [2026-06-04 21:19:38] Double precision check on file serial/sol_x2_y1.mtx 5/16 [OK]
[2026-05-30 13:02:07] Double precision check on file serial/sol_x2_y2.mtx 6/16 [OK] [2026-06-04 21:19:38] Double precision check on file serial/sol_x2_y2.mtx 6/16 [OK]
[2026-05-30 13:02:07] Double precision check on file serial/sol_x2_y3.mtx 7/16 [OK] [2026-06-04 21:19:39] Double precision check on file serial/sol_x2_y3.mtx 7/16 [OK]
[2026-05-30 13:02:07] Double precision check on file serial/sol_x2_y4.mtx 8/16 [OK] [2026-06-04 21:19:39] Double precision check on file serial/sol_x2_y4.mtx 8/16 [OK]
[2026-05-30 13:02:07] Double precision check on file serial/sol_x3_y1.mtx 9/16 [OK] [2026-06-04 21:19:39] Double precision check on file serial/sol_x3_y1.mtx 9/16 [OK]
[2026-05-30 13:02:07] Double precision check on file serial/sol_x3_y2.mtx 10/16 [OK] [2026-06-04 21:19:39] Double precision check on file serial/sol_x3_y2.mtx 10/16 [OK]
[2026-05-30 13:02:07] Double precision check on file serial/sol_x3_y3.mtx 11/16 [OK] [2026-06-04 21:19:39] Double precision check on file serial/sol_x3_y3.mtx 11/16 [OK]
[2026-05-30 13:02:07] Double precision check on file serial/sol_x3_y4.mtx 12/16 [OK] [2026-06-04 21:19:39] Double precision check on file serial/sol_x3_y4.mtx 12/16 [OK]
[2026-05-30 13:02:07] Double precision check on file serial/sol_x4_y1.mtx 13/16 [OK] [2026-06-04 21:19:39] Double precision check on file serial/sol_x4_y1.mtx 13/16 [OK]
[2026-05-30 13:02:07] Double precision check on file serial/sol_x4_y2.mtx 14/16 [OK] [2026-06-04 21:19:39] Double precision check on file serial/sol_x4_y2.mtx 14/16 [OK]
[2026-05-30 13:02:08] Double precision check on file serial/sol_x4_y3.mtx 15/16 [OK] [2026-06-04 21:19:39] Double precision check on file serial/sol_x4_y3.mtx 15/16 [OK]
[2026-05-30 13:02:08] Double precision check on file serial/sol_x4_y4.mtx 16/16 [OK] [2026-06-04 21:19:39] Double precision check on file serial/sol_x4_y4.mtx 16/16 [OK]
Welcome to PSBLAS version: 3.9.1 Welcome to PSBLAS version: 3.9.1
This is the psb_gedot_test sample program This is the psb_gedot_test sample program
Number of processes used in this computation: 4 Number of processes used in this computation: 4
[2026-05-30 13:02:08] Generation gedot single precision result file parallel/sol_x1_y1.mtx 1/16 [OK] [2026-06-04 21:19:39] Generation gedot single precision result file parallel/sol_x1_y1.mtx 1/16 [OK]
[2026-05-30 13:02:08] Generation gedot single precision result file parallel/sol_x1_y2.mtx 2/16 [OK] [2026-06-04 21:19:39] Generation gedot single precision result file parallel/sol_x1_y2.mtx 2/16 [OK]
[2026-05-30 13:02:08] Generation gedot single precision result file parallel/sol_x1_y3.mtx 3/16 [OK] [2026-06-04 21:19:39] Generation gedot single precision result file parallel/sol_x1_y3.mtx 3/16 [OK]
[2026-05-30 13:02:08] Generation gedot single precision result file parallel/sol_x1_y4.mtx 4/16 [OK] [2026-06-04 21:19:39] Generation gedot single precision result file parallel/sol_x1_y4.mtx 4/16 [OK]
[2026-05-30 13:02:08] Generation gedot single precision result file parallel/sol_x2_y1.mtx 5/16 [OK] [2026-06-04 21:19:39] Generation gedot single precision result file parallel/sol_x2_y1.mtx 5/16 [OK]
[2026-05-30 13:02:08] Generation gedot single precision result file parallel/sol_x2_y2.mtx 6/16 [OK] [2026-06-04 21:19:39] Generation gedot single precision result file parallel/sol_x2_y2.mtx 6/16 [OK]
[2026-05-30 13:02:08] Generation gedot single precision result file parallel/sol_x2_y3.mtx 7/16 [OK] [2026-06-04 21:19:39] Generation gedot single precision result file parallel/sol_x2_y3.mtx 7/16 [OK]
[2026-05-30 13:02:08] Generation gedot single precision result file parallel/sol_x2_y4.mtx 8/16 [OK] [2026-06-04 21:19:39] Generation gedot single precision result file parallel/sol_x2_y4.mtx 8/16 [OK]
[2026-05-30 13:02:08] Generation gedot single precision result file parallel/sol_x3_y1.mtx 9/16 [OK] [2026-06-04 21:19:39] Generation gedot single precision result file parallel/sol_x3_y1.mtx 9/16 [OK]
[2026-05-30 13:02:08] Generation gedot single precision result file parallel/sol_x3_y2.mtx 10/16 [OK] [2026-06-04 21:19:39] Generation gedot single precision result file parallel/sol_x3_y2.mtx 10/16 [OK]
[2026-05-30 13:02:08] Generation gedot single precision result file parallel/sol_x3_y3.mtx 11/16 [OK] [2026-06-04 21:19:39] Generation gedot single precision result file parallel/sol_x3_y3.mtx 11/16 [OK]
[2026-05-30 13:02:08] Generation gedot single precision result file parallel/sol_x3_y4.mtx 12/16 [OK] [2026-06-04 21:19:39] Generation gedot single precision result file parallel/sol_x3_y4.mtx 12/16 [OK]
[2026-05-30 13:02:08] Generation gedot single precision result file parallel/sol_x4_y1.mtx 13/16 [OK] [2026-06-04 21:19:39] Generation gedot single precision result file parallel/sol_x4_y1.mtx 13/16 [OK]
[2026-05-30 13:02:08] Generation gedot single precision result file parallel/sol_x4_y2.mtx 14/16 [OK] [2026-06-04 21:19:39] Generation gedot single precision result file parallel/sol_x4_y2.mtx 14/16 [OK]
[2026-05-30 13:02:08] Generation gedot single precision result file parallel/sol_x4_y3.mtx 15/16 [OK] [2026-06-04 21:19:39] Generation gedot single precision result file parallel/sol_x4_y3.mtx 15/16 [OK]
[2026-05-30 13:02:08] Generation gedot single precision result file parallel/sol_x4_y4.mtx 16/16 [OK] [2026-06-04 21:19:39] Generation gedot single precision result file parallel/sol_x4_y4.mtx 16/16 [OK]
[2026-05-30 13:02:08] Double precision check on file parallel/sol_x1_y1.mtx 1/16 [OK] [2026-06-04 21:19:39] Double precision check on file parallel/sol_x1_y1.mtx 1/16 [OK]
[2026-05-30 13:02:08] Double precision check on file parallel/sol_x1_y2.mtx 2/16 [OK] [2026-06-04 21:19:39] Double precision check on file parallel/sol_x1_y2.mtx 2/16 [OK]
[2026-05-30 13:02:08] Double precision check on file parallel/sol_x1_y3.mtx 3/16 [OK] [2026-06-04 21:19:39] Double precision check on file parallel/sol_x1_y3.mtx 3/16 [OK]
[2026-05-30 13:02:08] Double precision check on file parallel/sol_x1_y4.mtx 4/16 [OK] [2026-06-04 21:19:39] Double precision check on file parallel/sol_x1_y4.mtx 4/16 [OK]
[2026-05-30 13:02:08] Double precision check on file parallel/sol_x2_y1.mtx 5/16 [OK] [2026-06-04 21:19:39] Double precision check on file parallel/sol_x2_y1.mtx 5/16 [OK]
[2026-05-30 13:02:08] Double precision check on file parallel/sol_x2_y2.mtx 6/16 [OK] [2026-06-04 21:19:39] Double precision check on file parallel/sol_x2_y2.mtx 6/16 [OK]
[2026-05-30 13:02:08] Double precision check on file parallel/sol_x2_y3.mtx 7/16 [OK] [2026-06-04 21:19:39] Double precision check on file parallel/sol_x2_y3.mtx 7/16 [OK]
[2026-05-30 13:02:08] Double precision check on file parallel/sol_x2_y4.mtx 8/16 [OK] [2026-06-04 21:19:39] Double precision check on file parallel/sol_x2_y4.mtx 8/16 [OK]
[2026-05-30 13:02:08] Double precision check on file parallel/sol_x3_y1.mtx 9/16 [OK] [2026-06-04 21:19:39] Double precision check on file parallel/sol_x3_y1.mtx 9/16 [OK]
[2026-05-30 13:02:08] Double precision check on file parallel/sol_x3_y2.mtx 10/16 [OK] [2026-06-04 21:19:39] Double precision check on file parallel/sol_x3_y2.mtx 10/16 [OK]
[2026-05-30 13:02:08] Double precision check on file parallel/sol_x3_y3.mtx 11/16 [OK] [2026-06-04 21:19:39] Double precision check on file parallel/sol_x3_y3.mtx 11/16 [OK]
[2026-05-30 13:02:08] Double precision check on file parallel/sol_x3_y4.mtx 12/16 [OK] [2026-06-04 21:19:39] Double precision check on file parallel/sol_x3_y4.mtx 12/16 [OK]
[2026-05-30 13:02:08] Double precision check on file parallel/sol_x4_y1.mtx 13/16 [OK] [2026-06-04 21:19:39] Double precision check on file parallel/sol_x4_y1.mtx 13/16 [OK]
[2026-05-30 13:02:08] Double precision check on file parallel/sol_x4_y2.mtx 14/16 [OK] [2026-06-04 21:19:39] Double precision check on file parallel/sol_x4_y2.mtx 14/16 [OK]
[2026-05-30 13:02:08] Double precision check on file parallel/sol_x4_y3.mtx 15/16 [OK] [2026-06-04 21:19:39] Double precision check on file parallel/sol_x4_y3.mtx 15/16 [OK]
[2026-05-30 13:02:08] Double precision check on file parallel/sol_x4_y4.mtx 16/16 [OK] [2026-06-04 21:19:39] Double precision check on file parallel/sol_x4_y4.mtx 16/16 [OK]

File diff suppressed because it is too large Load Diff

@ -35,7 +35,20 @@ echo "" >> "${log_file_name}"
run_mpi 1 ./runs/psb_spmm_test "single process computation" run_mpi 1 ./runs/psb_spmm_test "single process computation"
run_mpi "$num_procs" ./runs/psb_spmm_test "${num_procs} processes computation" run_mpi "$num_procs" ./runs/psb_spmm_test "${num_procs} processes computation"
# Compare serial and parallel outputs if present # Compare serial and parallel outputs if present.
compare_dirs "serial" "parallel" "${log_file_name}" # spmm results are single precision and the distributed sparse mat-vec sums the
# row contributions in a different order than the serial run, so the outputs only
# agree to single-precision roundoff. The proper bound is the finite-precision
# error gamma_n = n*u/(1-n*u): EPS_MODE=gamma_n computes it (u = single-precision
# unit roundoff 1.19e-7), COMPARE=relative applies it as |fl-exact| <= gamma_n*|value|
# (an absolute tolerance is unsatisfiable for values of magnitude ~1e2).
# N=1000 generously bounds the per-row accumulation length (max 11 nnz/row, ~22
# for symmetric storage) to absorb cancellation in y=alpha*A*x+beta*y and the
# scatter/gather roundoff, while staying tight enough to catch real errors
# (observed max relative diff ~1.9e-5, ~6x below this gamma_n ~1.2e-4).
PSBLAS_TEST_EPS_MODE=gamma_n PSBLAS_TEST_N=1000 PSBLAS_TEST_UNIT_ROUNDOFF=1.19e-7 PSBLAS_TEST_COMPARE=relative \
compare_dirs "serial" "parallel" "${log_file_name}"
compare_status=$?
info "PSBLAS psb_spmm test completed." info "PSBLAS psb_spmm test completed."
exit $compare_status

File diff suppressed because it is too large Load Diff

@ -13,24 +13,24 @@ module psb_spmm_test
implicit none implicit none
! input parameters ! input parameters
character(len = *), intent(in) :: x_file, y_file character(len = *), intent(in) :: x_file, y_file
real(psb_spk_), intent(in) :: alpha, beta real(psb_spk_), intent(in) :: alpha, beta
type(psb_sspmat_type), intent(inout) :: a type(psb_sspmat_type), intent(inout) :: a
type(psb_desc_type), intent(inout) :: desc_a type(psb_desc_type), intent(inout) :: desc_a
integer(psb_ipk_), intent(in) :: rows, cols integer(psb_ipk_), intent(in) :: rows, cols
character(len=:), allocatable :: output_file_name character(len=:), allocatable :: output_file_name
! vectors ! vectors
type(psb_s_vect_type) :: x, y type(psb_s_vect_type) :: x, y
! communication context ! communication context
type(psb_ctxt_type), intent(in) :: ctxt type(psb_ctxt_type), intent(in) :: ctxt
integer(psb_ipk_) :: my_rank, np, info, err_act integer(psb_ipk_) :: my_rank, np, info, err_act
! variables outside PSLBALS data structures ! variables outside PSLBALS data structures
real(psb_spk_), allocatable :: x_global(:), y_global(:) real(psb_spk_), allocatable :: x_global(:), y_global(:)
logical :: exists logical :: exists
info = psb_success_ info = psb_success_
@ -42,9 +42,9 @@ module psb_spmm_test
endif endif
! Prepare input buffers on all ranks; root reads from disk ! Prepare input buffers on all ranks; root reads from disk
allocate(x_global(cols))
allocate(y_global(rows))
if(my_rank == psb_root_) then if(my_rank == psb_root_) then
allocate(x_global(cols))
allocate(y_global(rows))
call mm_array_read(x_global,info,filename=x_file) call mm_array_read(x_global,info,filename=x_file)
call mm_array_read(y_global,info,filename=y_file) call mm_array_read(y_global,info,filename=y_file)
end if end if
@ -119,8 +119,16 @@ module psb_spmm_test
output_file_name = output_file_name // "_b3.mtx" output_file_name = output_file_name // "_b3.mtx"
end if end if
! Save result to output file ! Gather result on root and save to output file
call mm_array_write(y,"Result vector",info,filename=output_file_name) call psb_gather(y_global,y,desc_a,info,root=psb_root_)
if(info /= psb_success_) then
write(psb_out_unit,*) "Error in psb_gather to collect y result"
goto 9999
end if
if (my_rank == psb_root_) then
call mm_array_write(y_global,"Result vector",info,filename=output_file_name)
end if
! Deallocate ! Deallocate
call psb_gefree(x, desc_a,info) call psb_gefree(x, desc_a,info)
@ -135,8 +143,10 @@ module psb_spmm_test
goto 9999 goto 9999
end if end if
deallocate(x_global) if(my_rank == 0) then
deallocate(y_global) deallocate(x_global)
deallocate(y_global)
end if
return return
@ -161,7 +171,8 @@ module psb_spmm_test
integer(psb_ipk_), intent(in) :: rows, cols integer(psb_ipk_), intent(in) :: rows, cols
real(psb_spk_), allocatable :: x(:), y(:) real(psb_spk_), allocatable :: x(:), y(:)
integer(psb_ipk_) :: i, info integer(psb_ipk_) :: i, info, nseed
integer, allocatable :: seed(:)
logical :: exists logical :: exists
inquire(file='vectors/', exist=exists) inquire(file='vectors/', exist=exists)
@ -172,7 +183,10 @@ module psb_spmm_test
allocate(x(cols)) allocate(x(cols))
allocate(y(rows)) allocate(y(rows))
call random_init(repeatable=.true.,image_distinct=.true.) call random_seed(size=nseed)
allocate(seed(nseed))
seed = 12345
call random_seed(put=seed)
call random_number(x) call random_number(x)
call random_number(y) call random_number(y)
@ -220,6 +234,7 @@ module psb_spmm_test
call mm_array_write(x,"Null vector",info,filename="vectors/x4.mtx") call mm_array_write(x,"Null vector",info,filename="vectors/x4.mtx")
call mm_array_write(y,"Null vector",info,filename="vectors/y4.mtx") call mm_array_write(y,"Null vector",info,filename="vectors/y4.mtx")
deallocate(seed)
deallocate(x) deallocate(x)
deallocate(y) deallocate(y)
@ -247,7 +262,10 @@ module psb_spmm_test
! Skip comment lines (starting with %) ! Skip comment lines (starting with %)
do do
read(unit, '(A)', iostat=ret) line read(unit, '(A)', iostat=ret) line
if (ret /= 0) exit if (ret /= 0) then
print *, 'Error reading file or end of file reached without finding header.'
stop
end if
if (line(1:1) /= '%') then if (line(1:1) /= '%') then
read(line, *) rows, cols, nnz read(line, *) rows, cols, nnz
found = .true. found = .true.

@ -23,11 +23,11 @@ program main
integer(psb_ipk_) :: tests_number, count, last_percent integer(psb_ipk_) :: tests_number, count, last_percent
! sparse matrices ! sparse matrices
type(psb_sspmat_type) :: a type(psb_sspmat_type) :: a
type(psb_lsspmat_type) :: aux_a type(psb_lsspmat_type) :: aux_a
! matrix descriptor data structure ! matrix descriptor data structure
type(psb_desc_type) :: desc_a type(psb_desc_type) :: desc_a
! Communicator variable ! Communicator variable
type(psb_ctxt_type) :: ctxt type(psb_ctxt_type) :: ctxt
@ -60,10 +60,6 @@ program main
matrix_file = "matrix/1138_bus.mtx" matrix_file = "matrix/1138_bus.mtx"
inquire(file=matrix_file, exist=matrix_exists) inquire(file=matrix_file, exist=matrix_exists)
if (.not.matrix_exists) then
matrix_file = "../../comm/spmv/Geo_1438.mtx"
inquire(file=matrix_file, exist=matrix_exists)
end if
if (.not.matrix_exists) then if (.not.matrix_exists) then
if (my_rank == psb_root_) then if (my_rank == psb_root_) then
write(psb_out_unit,*) 'Matrix file not found. Expected matrix/1138_bus.mtx' write(psb_out_unit,*) 'Matrix file not found. Expected matrix/1138_bus.mtx'
@ -80,6 +76,9 @@ program main
call generate_vectors(rows,cols) call generate_vectors(rows,cols)
end if end if
call psb_bcast(ctxt,rows)
call psb_bcast(ctxt,cols)
call psb_barrier(ctxt) call psb_barrier(ctxt)
!! Read and distribute matrix once !! Read and distribute matrix once
@ -98,7 +97,7 @@ program main
call psb_abort(ctxt) call psb_abort(ctxt)
end if end if
!! 1138_bus matrix (sparse) - reuse distributed matrix across all parameter combinations !! bcsstk29 matrix (sparse) - reuse distributed matrix across all parameter combinations
do i=1,size(x) do i=1,size(x)
do j=1,size(y) do j=1,size(y)
do k=1,size(alpha) do k=1,size(alpha)
@ -125,11 +124,13 @@ program main
contains contains
subroutine print_progress(current, total, last_percent, label) subroutine print_progress(current, total, last_percent, label)
use iso_fortran_env, only: error_unit
implicit none implicit none
integer(psb_ipk_), intent(in) :: current, total integer(psb_ipk_), intent(in) :: current, total
integer(psb_ipk_), intent(inout) :: last_percent integer(psb_ipk_), intent(inout) :: last_percent
character(len=*), intent(in) :: label character(len=*), intent(in) :: label
integer(psb_ipk_) :: percent, filled, width, i integer(psb_ipk_) :: percent, filled, width, i
character(len=160) :: line
if (total <= 0) return if (total <= 0) return
percent = int(real(current) / real(total) * 100.0) percent = int(real(current) / real(total) * 100.0)
@ -139,17 +140,29 @@ contains
width = 30 width = 30
filled = int(real(percent) / 100.0 * width) filled = int(real(percent) / 100.0 * width)
write(*,'(A)',advance='no') "[INFO] Progress " // trim(label) // ": [" line = "[INFO] Progress " // trim(label) // ": ["
do i = 1, filled do i = 1, filled
write(*,'(A)',advance='no') "#" line = trim(line) // "#"
end do end do
do i = filled + 1, width do i = filled + 1, width
write(*,'(A)',advance='no') "-" line = trim(line) // "-"
end do end do
write(*,'(A,I3,A,I0,A,I0,A)',advance='no') "] ", percent, "% (", current, "/", total, ")" line = trim(line) // "] "
write(*,'(A)',advance='no') char(13) write(line(len_trim(line)+1:), '(I3)') percent
call flush(6) line = trim(line) // "% (" // trim(adjustl(itoa(current))) // "/" // trim(adjustl(itoa(total))) // ")"
if (percent == 100) write(*,'(A)') "" if (percent < 100) then
write(error_unit,'(A)') char(13) // char(27) // "[2K" // trim(line) // char(27) // "[1A"
else
write(error_unit,'(A)') char(13) // char(27) // "[2K" // trim(line)
end if
call flush(error_unit)
end subroutine print_progress end subroutine print_progress
pure function itoa(i) result(str)
implicit none
integer(psb_ipk_), intent(in) :: i
character(len=32) :: str
write(str,'(I0)') i
end function itoa
end program main end program main

@ -1,59 +0,0 @@
/* Test program for checking if two arrays (output of alpha*A*x + beta*y) are the same
* Check the README.md to see all details about the tests.
*
* Author: Luca Pepé Sciarria, Staccone Simone (Tor Vergata University)
*/
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
void compare_files(const char *file1, const char *file2) {
FILE *file_s = fopen(file1, "r");
FILE *file_p = fopen(file2, "r");
if (!file_s || !file_p) {
perror("Error opening files");
exit(EXIT_FAILURE);
}
int n_s, n_p;
fscanf(file_s, "%d", &n_s);
fscanf(file_p, "%d", &n_p); // Assuming both files have the same number of lines
if (n_s != n_p) {
fprintf(stderr, "Error, differnet file sizes $d, $d", n_s, n_p);
exit(EXIT_FAILURE);
}
double value_s, value_p;
for (int i = 0; i < n_s; i++) {
fscanf(file_s, "%lf", &value_s);
fscanf(file_p, "%lf", &value_p);
if (value_s != value_p) {
printf("Index %d: %.2lf != %.2lf\n", i, value_s, value_p);
}
}
fclose(file_s);
fclose(file_p);
}
int main(int argc, char *argv[]) {
if (argc != 2) {
fprintf(stderr, "Usage: %s <partial_filename>\n", argv[0]);
return EXIT_FAILURE;
}
char file_s[256], file_p[256];
snprintf(file_s, sizeof(file_s), "%s_serial.txt", argv[1]);
snprintf(file_p, sizeof(file_p), "%s_parallel.txt", argv[1]);
compare_files(file_s, file_p);
return EXIT_SUCCESS;
}

@ -6,6 +6,7 @@ separator=$(printf "%0.s=" $(seq 1 $terminal_width)) # Generate separator of cor
flag=0 flag=0
log_file_name="psblas_test_results.log" log_file_name="psblas_test_results.log"
base_dir=$(pwd) base_dir=$(pwd)
failed_tests=""
# Define color codes # Define color codes
GREEN="\033[0;32m" GREEN="\033[0;32m"
@ -92,10 +93,12 @@ for dir in "$base_dir"/*/; do
( # excecute script in a subshell, otherwise the dir search will stop ( # excecute script in a subshell, otherwise the dir search will stop
cd "$dir" cd "$dir"
autotest_status=0
# Check if autotest.sh exists before executing it # Check if autotest.sh exists before executing it
if [ -f autotest.sh ]; then if [ -f autotest.sh ]; then
chmod +x autotest.sh chmod +x autotest.sh
./autotest.sh ./autotest.sh
autotest_status=$?
else else
echo -e "${YELLOW}[WARNING] autotest.sh not found in $(pwd). Skipping $(basename "$dir") kernel${RESET}" echo -e "${YELLOW}[WARNING] autotest.sh not found in $(pwd). Skipping $(basename "$dir") kernel${RESET}"
fi fi
@ -113,7 +116,13 @@ for dir in "$base_dir"/*/; do
else else
echo -e "${YELLOW}[WARNING] No .log files found in $(pwd). Skipping log append.${RESET}" echo -e "${YELLOW}[WARNING] No .log files found in $(pwd). Skipping log append.${RESET}"
fi fi
# Propagate the kernel's pass/fail status to the parent shell
exit $autotest_status
) )
if [ $? -ne 0 ]; then
failed_tests="${failed_tests}${base_name} "
fi
# Return to the parent directory # Return to the parent directory
echo -e "${BLUE}[INFO]\t Leaving directory: $(pwd)/$(basename "$dir")${RESET}" echo -e "${BLUE}[INFO]\t Leaving directory: $(pwd)/$(basename "$dir")${RESET}"
@ -124,4 +133,10 @@ done
echo -e "${BLUE}[INFO]\t Finished processing all subdirectories.${RESET}" echo -e "${BLUE}[INFO]\t Finished processing all subdirectories.${RESET}"
echo -e "${GREEN}[INFO]\t All tests completed successfully. Results are logged in ${log_file_name}.${RESET}" if [ -z "$failed_tests" ]; then
echo -e "${GREEN}[INFO]\t All tests completed successfully. Results are logged in ${log_file_name}.${RESET}"
exit 0
else
echo -e "${RED}[FAIL]\t Some tests failed: ${failed_tests%% }. Results are logged in ${log_file_name}.${RESET}"
exit 1
fi
Loading…
Cancel
Save